Sockets 当服务器关闭连接时,客户端是否也需要调用close

Sockets 当服务器关闭连接时,客户端是否也需要调用close,sockets,networking,tcp,Sockets,Networking,Tcp,因此,想象一下这样一种情况:客户机从套接字读取,读取返回0。这意味着EOF或服务器已关闭连接 客户端是否也应调用此文件描述符上的close?如果客户端未调用close,是否会导致文件描述符泄漏?是,您仍然需要关闭它。即使远程主机已关闭连接,您的计算机上也存在句柄 即使连接本身已关闭,您仍然可以引用套接字(调用套接字上的各种方法,包括read())。调用close()后,句柄已完全消失,因此调用方法比简单返回0更有可能导致分段错误 需要说明的是,调用close()有两个操作 它发送适当的数据包,通

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


客户端是否也应调用此文件描述符上的close?如果客户端未调用close,是否会导致文件描述符泄漏?

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

即使连接本身已关闭,您仍然可以引用套接字(调用套接字上的各种方法,包括
read()
)。调用
close()
后,句柄已完全消失,因此调用方法比简单返回0更有可能导致分段错误

需要说明的是,调用
close()
有两个操作

  • 它发送适当的数据包,通知远程主机套接字已关闭
  • 它会清理与该套接字关联的内存

  • 因此,即使远程主机关闭套接字,您仍然需要关闭以清理内存。

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