客户端断开连接后,是否必须关闭服务器端的套接字?

所以让我简化我正在处理的代码:

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()时,您正在做两件事:

>关闭套接字的本地端,让远程主机知道您也已完成传输.如果不这样做,您可能会让客户端挂起,等待您发送更多数据.
>关闭文件描述符.这将释放进程打开文件表中的条目.如果不这样做,您就会浪费资源,并且可能会发现自己内存不足或可用的文件描述符.大多数操作系统对进程可以一次打开的文件描述符(或句柄)的数量有一个硬限制.

转载注明原文:客户端断开连接后,是否必须关闭服务器端的套接字? - 代码日志