c - C中的套接字:关闭套接字的正确方法
问题描述
我经常看到使用套接字的服务器程序的示例代码。
(为简单起见,这里我不检查 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-closure-sockfd 会导致绑定错误(例如,这个套接字正在使用中......)。
如果你能帮助我,我真的很感激。感谢您的时间。
解决方案
如果程序退出,现代操作系统将自动释放应用程序分配的资源,如内存或打开的文件描述符(包括套接字)。因此,如果服务器套接字应该在整个程序中都可用(以便接受连接),则可以不显式关闭它,而是让操作系统在应用程序退出时执行此操作。
推荐阅读
- php - 使用 PHP curl 查询 mongodb
- c++ - 在 OpenGL 中使用光线投射进行鼠标拾取?
- webrtc - TURN 服务器中的“领域”是什么?
- javascript - 如何将 HTML 元素固定到他的初始位置?
- javascript - 在同一引用上有多个侦听器时从 Firebase 中删除侦听器
- kubectl - 将 EKS 令牌传递给其他 kubectl cli 命令
- amazon-web-services - JSON List of Dictionaries Querying in AWS Athena/Glue vs Quicksight
- javascript - 使用 React 高阶组件获取所有子组件 href
- java - 是什么导致 Mover 从屏幕上掉下来?
- sql - SQL 自动舍入变量