关闭客户端套接字,在服务器已经关闭它的一侧之后
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_onoff
和l_linger
都是非空的,在这种情况下它会等待指定的时间以允许发送排队的数据。如果您的程序无限期挂起,那么您的代码中可能还有另一个问题。
我建议在调用 closesocket 之前添加shutdown(sock, SD_BOTH)
,但是如果另一端已经关闭了他们的一端,我不确定是否会产生很大的不同。
@icabod 在closesocket()
之前使用shutdown()
是一种很好的做法,可以确保在连接的套接字关闭之前发送和接收所有数据,从而避免hard 关闭。但它只会禁用接收和/或传输,并且对已经无效的套接字没有影响。以上是关于关闭客户端套接字,在服务器已经关闭它的一侧之后的主要内容,如果未能解决你的问题,请参考以下文章