所以让我简化我正在处理的代码:
int fd = socket(...);
int client = accept(fd, ...);
while (true) {
int bytes_read = recv(client, ...);
if (bytes_read == 0) {
break;
}
};
此时我已经知道客户端断开连接(recv
返回0)。但是我还需要打电话吗
close(client);
?
最佳答案
是的。
当您recv()
0 字节时,这是内核让您知道远程主机已关闭其连接的发送 端的方式。他们可能仍然打开套接字并且可以接收更多您发送的数据(但不回复)。
当您在 TCP 套接字上调用 close()
时,您在做两件事:
- 关闭套接字的本地端,让远程主机知道您也已完成传输。如果不这样做,您可能会让客户端挂起,等待您发送更多数据。
- 关闭文件描述符。这将释放进程打开文件表中的条目。如果不这样做,您就是在浪费资源,并且可能会发现自己内存不足或可用的文件描述符不足。大多数操作系统都对进程一次可以打开的文件描述符(或句柄)的数量有硬性限制。
关于c - 客户端断开连接后,是否必须关闭服务器端的套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43368928/