使用.NET的“异步”API来防止TIME_WAIT

3

我有一个问题,我开发了一个客户端和服务器包装器供个人使用,但由于对网络编程知识不足,我的客户端在连接时出现了TIME_WAIT问题。现在我的客户端试图在短时间内向同一主机进行多次连接,我发现主要原因是因为我尝试重用套接字并且没有优雅地关闭连接,导致套接字进入TIME_WAIT状态。我想知道在使用.NET套接字时正确关闭连接的模式,以防止这种情况发生,特别是在使用“异步”API(如ConnectAsync、AcceptAsync、SendAsync、ReceiveAsync、DisconnectAsync)的情况下。


如果您使用TCP套接字,Windows中有一些默认设置,请参阅http://support.microsoft.com/kb/158474了解详细信息。如果您的客户端不是瘦客户端,我建议您使用WCF而不是TCP。 - Saeed Amiri
2个回答

8
我发现防止TIME_WAIT是不可能的。无论是服务器还是客户端,都会有问题,只取决于谁首先关闭连接。如果是客户端关闭连接,则服务器上将没有TIME_WAIT。如果是服务器先关闭,则客户端上将没有TIME_WAIT。因此,唯一剩下的选择是使用SO_REUSEADDR,但在这种情况下,仍然不可能使用重用的地址联系以前断开的主机。

有点老的线程...但是看到这个,因为它对我有效,可以防止TIME_WAIT:https://dev59.com/questions/81kR5IYBdhLWcg3w1gVt - cogumel0

2
您可以在套接字上使用SO_REUSEADDR来解决此问题。有关详细信息,请参见Socket.SetSocketOption,您需要设置的选项是ReuseAddress
顺便说一下,您真的不是要重用套接字吧?一旦出现错误,您必须关闭它并打开一个新的。

使用SO_REUSEADDR不是一个选项 http://www.unixguide.net/network/socketfaq/4.5.shtml - Lu4
@Lu4 为什么?我在两个链接中都没有看到任何应该避免的内容,只是需要理解其含义。例如,如果您想要在 NAT 后面实现 P2P TCP 连接,则这非常关键。 - Basic

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