为什么 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 而不是按值传递时,获取它们的函数可以用它们做它想做的事。在其他语言中也是如此。