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



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

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. 关闭文件描述符。这将释放进程打开文件表中的条目。如果不这样做,您将浪费资源,并且可能会发现自己内存不足或可用的文件描述符。大多数操作系统对进程一次可以打开的文件描述符(或句柄(的数量都有硬性限制。

您需要关闭描述符以释放绑定到它的资源。

答案是肯定的。 原因是accept((分配内存,close((释放内存。

想象一下这样的理论情况,你的代码处于循环中,每次你调用accept((时,它都会分配1GB的RAM(假装它是一个非常低效的套接字库:-((。 每当你调用close((时,它都会释放1GB的RAM。 如果你从不调用 close((,在内存不足之前,循环将发生多少次 accept((?

当然 accept(( 只分配一小块内存,但最终,你会耗尽内存,除非你对此做点什么。

最新更新