[英]C null pointer check fails in ai_next linked list
背景:我正在关注Beej 的网络编程指南,了解如何使用 C sockets 监听和接受传入连接。
问题:我遇到的问题是在遍历要监听的地址链表时遇到分段错误。 我确实检查下一个结构是否是 null,但这不起作用。
我试过的:在这段代码和我之前编写的工作示例之间,我只能说出一个区别,那就是这些是我自己计算机上的地址与另一台主机上的地址。 我也查看了 getaddrinfo 的手册页,据我所知,我正在关注示例实现。
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <errno.h>
#define MYPORT "6161"
int main() {
struct addrinfo hints, *res;
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_family = AI_PASSIVE;
getaddrinfo(NULL, MYPORT, &hints, &res);
struct addrinfo *addr;
for (addr = res; addr != NULL; addr = addr->ai_next) {
printf("Here's one addr!");
}
return 0;
}
我发现了问题...
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <errno.h>
#define MYPORT "6161"
int main() {
struct addrinfo hints, *res;
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_family = AI_PASSIVE;
getaddrinfo(NULL, MYPORT, &hints, &res);
struct addrinfo *addr;
for (addr = res; addr != NULL; addr = addr->ai_next) {
printf("Here's one addr!");
}
return 0;
}
这是你的代码。
这是更正后的代码:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <errno.h>
#define MYPORT "6161"
int main() {
struct addrinfo hints, *res;
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
getaddrinfo(NULL, MYPORT, &hints, &res);
struct addrinfo *addr;
for (addr = res; addr != NULL; addr = addr->ai_next) {
printf("Here's one addr!");
}
return 0;
}
您只写了两次ai_family
,因此将AI_PASSIVE
分配给了hints.ai_family
而不是hints.ai_flags
。
我尝试了更正的代码,它工作正常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.