【发布时间】:2020-12-31 18:22:37
【问题描述】:
背景:我正在关注Beej's Guide to Network Programming,了解如何使用 C 套接字侦听和接受传入连接。
问题:我遇到的问题是在遍历要监听的地址链表时出现分段错误。我确实检查下一个结构是否为空,但这不起作用。
我的尝试:在这段代码和我之前编写的工作示例之间,我只能说出一个区别,那就是这些是我自己计算机上的地址还是另一台主机上的地址。我也查看了 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;
}
【问题讨论】:
-
我第一眼想到的唯一一件事是
getaddrinfo可能会失败(但我不知道为什么),因此不会更改res。您能否检查getaddrinfo的返回值以及调用getaddrinfo后res 是否发生变化?编辑:我是对的:执行您的代码会出现以下错误:*ai_family not supported(我使用 gai_strerror 进行检查)。我正在调查它... -
我假设如果出现错误,
getaddrinfo不会触及res指针。您需要在调用之前自行将其初始化为NULL,或者您需要注意返回值(您应该始终这样做!)。 -
我建议使用
int err = getaddrinfo(NULL, MYPORT, &hints, &res);,然后使用if (err == 0) ... else fprintf(stderr, "%s\n", ai_strerror(err));
标签: c pointers getaddrinfo