首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解CSAPP书中的代码片段open_clientfd(字符*主机名,字符*端口)?

理解CSAPP书中的代码片段open_clientfd(字符*主机名,字符*端口)?
EN

Stack Overflow用户
提问于 2019-01-15 17:42:35
回答 1查看 404关注 0票数 3

在阅读“计算机系统:程序员的视角”这本书时,在网络编程一章中,我看到了一个函数:

代码语言:javascript
复制
int open_clientfd(char *hostname, char *port) {
    int clientfd;
    struct addrinfo hints, *listp, *p;

    /* Get a list of potential server addresses */
    memset(&hints, 0, sizeof(struct addrinfo));
    hints.ai_socktype = SOCK_STREAM;  /* Open a connection */
    hints.ai_flags = AI_NUMERICSERV;  /* ... using a numeric port arg. */
    hints.ai_flags |= AI_ADDRCONFIG;  /* Recommended for connections */
    Getaddrinfo(hostname, port, &hints, &listp);

    /* Walk the list for one that we can successfully connect to */
    for (p = listp; p; p = p->ai_next) {

        /* Create the socket descriptor */
        if ((clientfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) < 0) 
            continue; /* Socket failed, try the next */
        if (connect(clientfd, p->ai_addr, p->ai_addrlen) != -1) 
            break; /* Success */
        Close(clientfd); /* Connect failed, try another */
    } 

    /* Clean up */
    Freeaddrinfo(listp);
    if (!p) /* All connects failed */
        return -1;
    else    /* The last connect succeeded */
        return clientfd;
}

我不理解的是这里的这行Close(clientfd); /* Connect failed, try another */,因为如果套接字创建失败,它将继续,如果它成功,它将中断for循环,似乎这行永远不会有机会执行?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-15 17:49:06

socket成功时,您就打开了一个套接字。如果connect失败,套接字仍然存在,必须关闭。循环的下一个周期将使用列表中的下一个地址,该地址可能需要为socket调用提供不同的参数。这就是为什么现有的套接字没有被重用的原因。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54196237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档