gpt4 book ai didi

c - 了解 CSAPP 书中的代码片段 open_clientfd(char *hostname, char *port)?

转载 作者:行者123 更新时间:2023-12-03 11:49:56 26 4
gpt4 key购买 nike

在看《Computer Systems: A Programmer's Perspective》这本书和网络编程那一章的时候,看到了这样一个函数:

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 */,因为如果socket创建失败,它会继续,如果成功,它会跳出for循环,似乎这行永远不会有机会执行?

最佳答案

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

关于c - 了解 CSAPP 书中的代码片段 open_clientfd(char *hostname, char *port)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54196237/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com