客户端出现10048 Socket错误?可能的原因是什么?

5
我正在编写自定义TCP服务器和客户端,进行大量请求(确切地说是60,000个请求)后,我开始遇到10048号套接字错误,这意味着“地址已经在使用” (should mean).
除非我暂停进程大约2至3分钟然后重新开始,否则该错误会持续发生,并且在重新启动后不久就会再次发生相同的错误。如果我暂停客户端进程并重新启动服务器进程,则仍然会在客户端上收到相同的错误。因此,这是完全客户端问题。
但这没有道理,通常只有在绑定时才会出现此错误,并且此错误发生在客户端而不是服务端。可能的原因是什么?
以下是我的初始化摘录:
TcpClient client = new TcpClient();
client.Connect("XXXXX -- some ip", 25000);
client.NoDelay = true;
NetworkStream clientStream = client.GetStream();

此外,其他所有功能似乎都正常工作(包括来回发送所需的时间),当使用127.0.0.1时完美运行,但将其放在另一台局域网计算机上时,我开始遇到10048错误。
我初始化有问题吗?还有什么可能导致客户端出现此错误?
2个回答

9
请查看SetSocketOption。您需要DontLinger或ReuseAddr,或两者兼备,我不确定。基本上,一旦您拆除TCP连接,您的套接字会在TIME_WAIT状态下停留一段时间,一旦您获得足够数量的套接字,您将无法创建任何新的客户端连接。可以通过netstat -na程序输出来验证此情况。
您还可以通过更改注册表中的设置来减少套接字停留在TIME_WAIT状态的时间: http://msdn.microsoft.com/en-us/library/aa560610%28BTS.20%29.aspx 默认值为4分钟,特别是在测试时,可以将其安全地缩短到1或2分钟。
免责声明:我绝非TCP专家。

我添加了 client.LingerState=new LingerOption(false,0); 并使用 netstat,你是对的,我有大量处于 TIME_WAIT 状态的连接。 - Earlz
我的意思是,在添加了“LingerState”位之后,我仍然有很多TIME_WAIT。 - Earlz
ReuseAddr也没有帮助。 - Earlz
另一种选择是找到一种重复使用连接的方法,而不是在一个请求之后就断开它们。 - caf

0

如果这是原因,那么为什么每当我使用本地主机时它都能正常工作呢? - Earlz
1
@Earlz:这可能是因为127.0.0.1上的连接使用非常低(0?)的最大段寿命,因此我们确实无法获得漫游数据包。我在谷歌上找不到任何相关信息,但这很有道理。您可以尝试使用接口IP,看看是否可以在本地机器上重现此问题-虽然这也可能被优化了。另外,请查看是否可以在服务器上将TcpTimedWaitDelay设置为30秒(http://msdn.microsoft.com/en-us/library/ms819739.aspx)。 - Mads Ravn

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