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

标签 c sockets

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

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

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

关于c - 客户端断开连接后,是否必须关闭服务器端的套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43368928/

相关文章:

c - 按位连接

python - recvfrom 返回的地址的第二部分是什么?

python - 如何在云上免费托管和运行 Python 脚本并在线访问?

python - 服务器发送的速度快于客户端的接收速度

c++ - C/C++ : Flush output before abnormal termination

c - malloc(sizeof(int)) vs malloc(sizeof(int *)) vs (int *)malloc(sizeof(int))

python - python Web浏览器中的400错误请求

c# - 异步返回服务器消息到客户端

c - 声明没有最高维度的数组

c - 如何在 C 中获取数组的下一个元素?