关闭客户端套接字,在服务器已经关闭它的一侧之后

Posted

技术标签:

【中文标题】关闭客户端套接字,在服务器已经关闭它的一侧之后【英文标题】:Closing a client socket , after server has already closed it's side 【发布时间】:2013-10-16 12:05:01 【问题描述】:

Winsock32 / C++ / Win32 环境)

据我了解,与关闭文件句柄(例如使用CloseHandle())相反, 关闭套接字是两个部分的操作,除了释放SOCK 句柄和释放实际资源,它还负责在会话终止时通知连接的另一端。

问题是,如何处理服务器出于自身原因关闭连接,然后客户端尝试关闭连接的情况。这意味着,如何只做资源释放部分,如上所述,而不通知终止。

【问题讨论】:

这是一个网络——服务器和客户端总是有可能以重叠的方式关闭连接。在任一端,关闭句柄并处理关闭期间可能引发的任何错误/异常。 @MartinJames 你当然是对的,但是根据 MSDN,关闭 SOCK 句柄是使用 closesocket() 完成的,在所描述的情况下,它只是 blocks i> 我们这里可能有XY problem。 【参考方案1】:

如何处理服务器关闭连接的情况 自己的原因?

如果你在一个已经被关闭连接失效的套接字上调用closesocket(),你只是释放了套接字描述符,你不必担心另一端的套接字是否被关闭。

【讨论】:

我没有。问题是当closesocket() blocks 在这种情况下。 @JimLanflte closesocket() 不会阻塞,除非套接字的选项l_onoffl_linger 都是非空的,在这种情况下它会等待指定的时间以允许发送排队的数据。如果您的程序无限期挂起,那么您的代码中可能还有另一个问题。 我建议在调用 closesocket 之前添加shutdown(sock, SD_BOTH),但是如果另一端已经关闭了他们的一端,我不确定是否会产生很大的不同。 @icabod 在closesocket() 之前使用shutdown() 是一种很好的做法,可以确保在连接的套接字关闭之前发送和接收所有数据,从而避免hard 关闭。但它只会禁用接收和/或传输,并且对已经无效的套接字没有影响。

以上是关于关闭客户端套接字,在服务器已经关闭它的一侧之后的主要内容,如果未能解决你的问题,请参考以下文章

UDP打孔到期[关闭]

为啥我的 TCP 服务器套接字在一个客户端断开连接后关闭?

远程登录我的套接字侦听端口正在关闭套接字

.NET 桌面客户端应用程序:套接字还是 HTTP 请求? [关闭]

如何使用java套接字编程知道网络何时关闭

实现 SSL 证书的 Python 套接字 [关闭]