【发布时间】: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 状态。