为什么 getaddrinfo() return 是函数输入部分的一个值?
Why does getaddrinfo() return a value in the inputs part of the function?
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);
Per Beej 的 site 它说:
"You give this function three input parameters, and it gives you a pointer to a linked-list, res, of results."
在用法方面是:
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;
}
实际 return 值 "rv" 实际上从未使用过。但是结果取自本例中的第四个输入"res"或"servinfo"。我知道涉及链表,但我不清楚为什么函数 return 不能以正常方式运行。为什么 "rv" 不是迭代获取地址的数组?为什么输入也 return 结果?
值rv
被使用。如果操作成功则它包含 0,如果操作失败则包含错误代码。您甚至可以看到您在问题中提供的示例代码中使用了 rv
!
// ↓ result is compared to 0
if ((rv = getaddrinfo(NULL, PORT, &hints, &servinfo)) != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
// ↑ error message based on rv
return 1;
}
C 不支持具有多个 return 值的函数。在像 getaddrinfo()
这样具有多个输出的函数中,至少有一个输出必须作为指针传递给函数。
或者,可以定义一个结构来包含 getaddrinfo()
的结果,但这会有点笨拙。
函数的编码方式是 return 值只是一个状态代码——函数是否成功执行。然后将更复杂的结果集填充到提供的链表指针中。
在 C 语言中做这样的事情并不少见。**res 符号肯定令人困惑,但这等同于在 java 中给函数一个空的 LinkedList 对象,然后函数填充。
总而言之 - 在 C 语言中 - 这并不少见。当输入按 reference/pointer 而不是按值传递时,获取它们的函数可以用它们做它想做的事。在其他语言中也是如此。
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);
Per Beej 的 site 它说:
"You give this function three input parameters, and it gives you a pointer to a linked-list, res, of results."
在用法方面是:
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;
}
实际 return 值 "rv" 实际上从未使用过。但是结果取自本例中的第四个输入"res"或"servinfo"。我知道涉及链表,但我不清楚为什么函数 return 不能以正常方式运行。为什么 "rv" 不是迭代获取地址的数组?为什么输入也 return 结果?
值rv
被使用。如果操作成功则它包含 0,如果操作失败则包含错误代码。您甚至可以看到您在问题中提供的示例代码中使用了 rv
!
// ↓ result is compared to 0
if ((rv = getaddrinfo(NULL, PORT, &hints, &servinfo)) != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
// ↑ error message based on rv
return 1;
}
C 不支持具有多个 return 值的函数。在像 getaddrinfo()
这样具有多个输出的函数中,至少有一个输出必须作为指针传递给函数。
或者,可以定义一个结构来包含 getaddrinfo()
的结果,但这会有点笨拙。
函数的编码方式是 return 值只是一个状态代码——函数是否成功执行。然后将更复杂的结果集填充到提供的链表指针中。
在 C 语言中做这样的事情并不少见。**res 符号肯定令人困惑,但这等同于在 java 中给函数一个空的 LinkedList 对象,然后函数填充。
总而言之 - 在 C 语言中 - 这并不少见。当输入按 reference/pointer 而不是按值传递时,获取它们的函数可以用它们做它想做的事。在其他语言中也是如此。