C++ 成功调用closesocket()后,Winsock TCP侦听器将保持侦听状态

C++ 成功调用closesocket()后,Winsock TCP侦听器将保持侦听状态,c++,tcp,listener,winsock,C++,Tcp,Listener,Winsock,我正在处理一个现有的DLL,其中创建了一个TCP侦听套接字,并设置为在出现故障时使用SO_REUSEADDR立即重新绑定到同一套接字。但是,目前存在一个问题,即即使成功调用closesocket(),侦听器仍将保持侦听状态;由于它不输入TIME_WAIT,因此在重新创建套接字时,会在同一端口上创建一个新的侦听器。然后,客户端无法连接到新的侦听器(大概是这样)。因此_LINGER设置为0秒。当插座关闭时,没有挂起的传输。最旧的插座似乎在大约十秒钟后关闭,而没有明显进入另一种状态 成功调用close

我正在处理一个现有的DLL,其中创建了一个TCP侦听套接字,并设置为在出现故障时使用SO_REUSEADDR立即重新绑定到同一套接字。但是,目前存在一个问题,即即使成功调用closesocket(),侦听器仍将保持侦听状态;由于它不输入TIME_WAIT,因此在重新创建套接字时,会在同一端口上创建一个新的侦听器。然后,客户端无法连接到新的侦听器(大概是这样)。因此_LINGER设置为0秒。当插座关闭时,没有挂起的传输。最旧的插座似乎在大约十秒钟后关闭,而没有明显进入另一种状态

成功调用closesocket()后,如何使侦听器保持侦听状态

  • 你关错插座了
  • 您复制了手柄,但忘记关闭副本
  • 有人抢走了港口
  • 您的失败代码检测到侦听器的失败,而其他东西是失败的
  • 您的侦听器在未失败时报告失败
  • 失败模式会破坏状态,因此closesocket()会关闭其他内容

  • 我想你的意思是“重新绑定到同一个地址”。答案是,在成功调用closesocket()后,它不应保持侦听状态。我建议您仔细检查参数和返回值,以确保您正在关闭您认为是的套接字。调试器是您的朋友。是的,正在重新绑定到同一地址。调试显示正确的套接字句柄正在传递给closesocket(),并且在调用closesocket()之前不会触发套接字句柄上的数据断点。套接字从不重复。无论ProcExp显示的进程中侦听器的数量如何(最初一个,运行时两个重叠),在对closesocket()进行有效调用后,没有一个侦听器进入TIME_WAIT状态。1)验证close是否位于正确的套接字句柄上。2) 手柄没有复制到任何地方;仅仅存储在变量中。3) 该端口已验证为仅由该程序使用。4)必须对此进行调查。4-7是我在没有闭包的情况下一直在研究的问题,并将继续研究这些问题。一个我忘记关闭的非常老的问题-事实上,套接字句柄在启用句柄继承的CreateProcess()调用中被复制。套接字句柄设置为不可继承,但这对WinSock句柄没有影响。