【问题标题】: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

标签: c++ sockets winapi winsock


【解决方案1】:

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

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

【讨论】:

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