【发布时间】:2017-09-17 17:22:20
【问题描述】:
getaddrinfo()的定义是:
int getaddrinfo(const char *node, // e.g. "www.example.com" or IP
const char *service, // e.g. "http" or port number
const struct addrinfo *hints,
struct addrinfo **res);
根据 Beej 的 site 它说:
“你给这个函数三个输入参数,它给你一个指向结果的链表 res 的指针。”
在用法方面是:
if ((rv = getaddrinfo(NULL, PORT, &hints, &servinfo)) != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
return 1;
}
// loop through all the results and bind to the first we can
for(p = servinfo; p != NULL; p = p->ai_next) {
if ((sockfd = socket(p->ai_family, p->ai_socktype,
p->ai_protocol)) == -1) {
perror("server: socket");
continue;
}
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes,
sizeof(int)) == -1) {
perror("setsockopt");
exit(1);
}
if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
close(sockfd);
perror("server: bind");
continue;
}
break;
}
实际的返回值“rv”实际上从未使用过。但在本例中,结果取自第四个输入“res”或“servinfo”。我知道涉及到一个链表,但我不清楚为什么函数返回不以正常方式运行。为什么“rv”不是一个通过迭代来获取地址的数组?为什么输入也返回结果?
【问题讨论】:
-
如果你仔细看,
rv确实用在了第二行。当它被传递给gai_seterror以格式化错误消息给用户以指示调用失败的原因。 -
做一些关于在C中模拟通过引用传递的研究。
-
您不能引用第三方网站作为参考。您是否考虑过查阅 man 页面?
标签: c sockets networking getaddrinfo