警告:请像我这样的菜鸟一样对待我.这是我的第一个"真正的"C程序.所以,如果我不理解某些事情,那就是原因.
我正在尝试按照Beej的网络编程指南中的示例制作聊天服务器.它被推荐,所以你去.
我想让一个函数接受一个指向结构的指针,修改该指针中的属性,并在传递的端口上设置一个监听器.在下面的代码中,我收到了分段错误,老实说,我无法弄清楚原因.怪我是绿色的.(如果需要,在Ubuntu上使用Netbeans 6.8开发):
#define PORT "4400"
typedef struct {
int port;
fd_set *connections;
int connections_count;
int listener;
struct addrinfo address;
struct addrinfo socket_hints;
} Server;
typedef struct {
struct sockaddr_storage address; // User's address
int fs_id; // ID to the socket they belong to
char *name; // Pointer to the user's name
struct User *nextUser; // Next user in the list
} User;
void initialize_server(Server *passed_server, char *port) {
struct addrinfo *temp;
int result;
// Set up the server hints
memset(&passed_server->socket_hints, 0, sizeof(struct addrinfo));
passed_server->socket_hints.ai_family = AF_UNSPEC;
passed_server->socket_hints.ai_socktype = SOCK_STREAM;
passed_server->socket_hints.ai_flags = AI_PASSIVE;
result = getaddrinfo(NULL, port, &passed_server->socket_hints, &temp);
printf("Result: %d\n", result);
}
int main(int argc, char** argv) {
// Set up socket stuff
Server *server; // Set up the server
memset(server, 0, sizeof(Server));
fd_set read_sockets; // Master socket holder and sockets to read
int new_connection; // Holds the socket ID of the new connection
socklen_t address_length; // Used to hold the length of the address from the user
struct addrinfo;
// Useful sets
char buffer[1024];
int bytes_recieved;
int yes = 1; // For SETOPT
// Set up server info on defined port
initialize_server(server, PORT);
FD_ZERO(&read_sockets);
return (EXIT_SUCCESS);
}
Run Code Online (Sandbox Code Playgroud)
如果你需要完整的代码(我想我发布了所有必需的代码),你可以在下面找到一个链接.在此先感谢任何帮助或尝试!
这条线:
Server *server;
Run Code Online (Sandbox Code Playgroud)
实际上并没有为服务器结构分配任何空间,仅用于指向一个服务器结构的指针,该指针设置为随机值.
看起来你需要的改变是:
Server *server = malloc (sizeof (Server));
Run Code Online (Sandbox Code Playgroud)
它实际上为你分配了一些内存.
想想差异如下:
Server *server; | Server *server = malloc (sizeof (Server));
+----------+ | +---------+ +-----------+
server | ???????? | --> ??? | server | pointer | --> | structure |
+----------+ | +---------+ +-----------+
Run Code Online (Sandbox Code Playgroud)