服务器关闭连接时客户端是不是也需要调用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() 时,套接字未关闭服务器端