服务器关闭连接时客户端是不是也需要调用close

Posted

技术标签:

【中文标题】服务器关闭连接时客户端是不是也需要调用close【英文标题】:Does client also need to call close when the server closes the connection服务器关闭连接时客户端是否也需要调用close 【发布时间】:2013-05-01 15:26:44 【问题描述】:

因此,想象一下客户端从套接字读取并读取返回 0 的情况。这意味着 EOF 或服务器已关闭连接。

客户端也应该在这个文件描述符上调用 close 吗?如果客户端不调用 close 是否会导致某些文件描述符泄漏?

【问题讨论】:

【参考方案1】:

是的,您仍然需要关闭它。即使远程主机已关闭连接,该句柄仍存在于您的机器上。

即使连接本身已经关闭,你仍然可以引用套接字(调用包括read()在内的各种方法。调用close()之后,句柄已经完全消失,因此调用方法更容易造成分段错误而不是简单地返回 0。

要清楚。调用close() 有两个动作。

    它发送适当的数据包来告诉远程主机套接字已关闭。 它会清理与该套接字关联的内存。

所以即使远程主机关闭了套接字,你仍然需要 close 来清理内存。

【讨论】:

因此,当服务器关闭连接时,内核中的某些状态仍然存在于客户端中。那么,当客户端调用close时,是否会向服务器发送一个FIN?如果是,那么即使是服务器也需要为该 tcp 连接保留一些状态,直到客户端调用 close。 是的,如果套接字在远程主机关闭连接时被破坏,那么后续调用将向操作系统询问不存在的内容,并导致您的应用程序崩溃。所以“socket”必须存在,直到本地应用程序调用close(),即使连接消失了。连接一直存在,直到本地应用程序或远程应用程序调用 close() 或发生其他一些超时。 使用关闭的套接字返回错误代码。它不会导致分段冲突或程序崩溃。

以上是关于服务器关闭连接时客户端是不是也需要调用close的主要内容,如果未能解决你的问题,请参考以下文章

三连四断

在客户端 JAVA 中调用 socket.close() 时,套接字未关闭服务器端

客户端产生CLOSE WAIT状态的解决方案

在线客服~~

c调用 socket 如果客户端连接断开,怎么判断? 还有怎么向多个 连接在一个服务器上的多个客户

JavaFX程序关闭或丢失连接时的PHP函数[关闭]