SocketOptionName.ReuseAddress用于什么?

7
我曾经认为使用SocketOptionName.ReuseAddress可以重用处于TIME_WAIT状态的端口。但是我进行了实验,发现它似乎没有任何效果。
如果我使用netstat检查socket,并且显示socket处于TIME_WAIT状态,然后立即再次运行客户端,我会收到异常:
“只允许每个套接字地址(协议/网络地址/端口)使用一次,通常允许172.16.16.16:12345”
我无法理解其中的含义。请问SocketOptionName.ReuseAddress有什么作用?
1个回答

1

你为什么要绑定客户端端口呢?你可能不需要这样做,如果你不需要的话,最好让操作系统为你选择一个临时端口,这样你就不会有这个问题了。

另外,你觉得重用一个处于 TIME_WAIT 状态的套接字是一个好主意吗?这种状态存在有着有效的理由......

至于为什么对你不起作用,看看我在回答这个类似问题时发布的链接:当使用 Winsock 绑定客户端 TCP 套接字到特定本地端口时,SO_REUSEADDR 没有任何效果


感谢您的回答。在我的实际应用中,我没有将客户端绑定到一个端口。但是该应用程序有大量的传入连接,因此可能会用尽空闲端口(而不处于TIME_WAIT状态)。为了模拟这种情况,我明确地做了这件事。 - Hemant
你实际的问题是你有一个服务器,有入站连接,它们最终会处于 TIME_WAIT 状态,而你希望它们不会。通常,有更好的方法来解决这个特定的问题:1)你能否将主动关闭移到客户端?2)如果不能,你能否进行异常关闭并发送 RST 而不是正常关闭?等等。尽管如此,至少你尝试了这条路,而不是简单地决定缩短整个机器的 TIME_WAIT 期限...在这里搜索,有很多相关问题。 - Len Holgate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接