代码之家  ›  专栏  ›  技术社区  ›  Zakoff

为什么getaddrinfo()在函数的输入部分返回一个值?

  •  -1
  • Zakoff  · 技术社区  · 7 年前

    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”实际上从未使用过。但结果来自 第四个输入

    2 回复  |  直到 7 年前
        1
  •  2
  •   Dietrich Epp    7 年前

    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不支持具有多个返回值的函数。在如下函数中 getaddrinfo() 对于多个输出,必须将至少一个输出作为指针传递到函数中。

    getaddrinfo()

        2
  •  1
  •   Dmytro Bugayev    7 年前

    函数的编码方式是返回值只是一个状态码——无论函数是否成功执行。然后将更复杂的结果集填充到提供的链表指针中。

    在C语言中这样做并不少见,**res符号当然令人困惑,但这相当于在java中给函数一个空的LinkedList对象,然后函数填充该对象。

    总之,在C语言中,这并不罕见。当输入是通过引用/指针而不是通过值传递时,获取它们的函数可以用它们做它想做的事情。在其他语言中也是如此。