我经常看到使用套接字的服务器程序的示例代码。
(为简单起见,这里我不检查 socket() 或 bind() 等函数的返回值。)
int sockfd = 0, newsockfd = 0;
struct sockaddr_in address;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
bind(sockfd, (struct sockaddr*)&address, sizeof(address));
listen(sockfd, 1);
newsockfd = accept(sockfd, (struct sockaddr*)NULL, NULL);
... do some communication ...
close(newsockfd);
我在网上找到的大多数示例代码都有close(newsockfd)但没有close(sockfd)。我的问题是不关闭 sockfd是否真的正确。
如果正确,我想知道为什么。我的理解是 sockfd 是文件描述符之一,它似乎没有理由不关闭它就退出程序。
更具体地说,我想知道 not-closed-sockfd 会在程序下次运行时导致绑定错误(例如,此套接字正在使用中...)。
如果你能帮助我,我真的很感激。感谢您的时间。
当您停止收听时,您应该始终关闭 sockfd。
有些开发者不太在意不关闭 sockfd 的两个原因:
但是,如果您的程序在某个事件上启动侦听套接字,然后在一段时间后关闭它并循环,那么您必须关闭 sockfd,以防止在下一次迭代时出现错误 EADDRINUSE(地址已在使用)和内存泄漏。
此外,错误 EADDRINUSE (Address already in use) 可能发生在其他情况下,我在此不详述。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句