【问题标题】:Winsock TCP listener stays in LISTENING state after successful closesocket() call成功调用 closesocket() 后,Winsock TCP 侦听器保持在 LISTENING 状态
【发布时间】:2012-01-26 19:31:55
【问题描述】:

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

在成功调用 closesocket() 后,什么可以使侦听器保持在 LISTENING 状态?

【问题讨论】:

  • 我认为你的意思是“重新绑定到同一个地址”。答案是它不应该在成功调用 closesocket() 后保持监听状态。我建议您仔细检查参数和返回值,以确保您正在关闭您认为的套接字。调试器是你的朋友。
  • 是的,重新绑定到同一个地址。调试显示正确的套接字句柄正在传递给 closesocket(),并且在调用 closesocket() 之前未触发套接字句柄上的数据断点。套接字永远不会重复。无论 ProcExp 显示的进程中有多少侦听器(最初是一个,运行时两个重叠),在对 closesocket() 的有效调用后,它们都不会进入 TIME_WAIT 状态。

标签: c++ tcp listener winsock


【解决方案1】:
  1. 您关闭了错误的套接字。
  2. 您复制了句柄并忘记关闭副本。
  3. 其他人抢购了端口。
  4. 您的故障代码检测到侦听器的故障,而其他原因是失败的。
  5. 您的侦听器在没有失败的情况下报告失败。
  6. 您的故障模式破坏了状态,因此 closesocket() 关闭了其他东西。

【讨论】:

  • 1) 验证关闭是在正确的套接字句柄上。 2)句柄在任何地方都没有重复;仅仅存储在一个变量中。 3) 该端口被验证只能由该程序使用。4) 必须对此进行调查。 4-7 是我一直在调查但尚未结束的问题,并将继续研究这些问题。
  • 一个非常老的问题,我忘了关闭 - 事实上,套接字句柄在启用句柄继承的 CreateProcess() 调用中被复制。套接字句柄被设置为不可继承,但这对 WinSock 句柄没有影响。
猜你喜欢
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
  • 2017-01-05
  • 2022-01-05
  • 2018-06-19
  • 2016-01-02
  • 1970-01-01
相关资源
最近更新 更多