警告:请像对待我的菜鸟一样对待我。这是我第一个“真正的”C程序。所以如果我不明白一些事情,那就是为什么。如何在getaddrinfo中处理这个指针?
我试图按照Beej的网络编程指南中的示例制作一个聊天服务器。它被推荐,所以你去。
我想要一个函数接受指向结构的指针,修改该指针的属性,并在传递的端口上设置侦听器。在下面的代码中,我得到了一个分段错误,我真的不知道为什么。怪我是绿色的。 (在Netbeans的6.8 Ubuntu的开发,如果需要的话):
#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);
}
如果您需要完整的代码(我想我张贴的一切必要的),你可以在下面找到一个链接。预先感谢您的帮助或尝试!
+1,为优秀的第一篇文章。欢迎来到StackOverflow。我能想到的唯一一件事可以改善这种情况:如果你通过调试器运行这段代码(比如说gdb)和调试信息,它应该告诉你这段代码是在哪个段上进行分段转换的,这可能是一个很好的起点调试。 – Thanatos 2010-08-16 03:42:24
谢谢。我会窥探一下。 – Codeacula 2010-08-16 03:43:06
只是一些提示。您可能想尝试在emacs 23上进行开发。另外,当您得到堆栈残余时,通常是由寻址无效内存引起的。尝试使用gdb和backtrace(bt)。它会把你带到失败的那一行。并且还可以安装valgrind,它非常适合追踪内存错误。即valgrind --leak-check = yes ./your_app。希望有所帮助。 – ant2009 2010-08-16 06:12:11