2010-03-29 65 views
5

我正在写一个自定义的TCP服务器和客户端,并做了大量的请求(准确的60,000)我开始得到这个10048的套接字错误,其中should mean“该地址已被使用。”客户端上的套接字错误10048?可能的原因?

错误不断发生,除非我暂停过程像2或3分钟,然后重新开始,然后在重新启动它后不久就会出现相同的错误。如果我暂停客户端进程并重新启动服务器进程,我仍然会在客户端上看到相同的错误。所以这是一个完整的客户端问题。

虽然这并没有任何意义,但这种错误通常只发生在绑定时,并且此错误发生在客户端而不是服务器上。可能的原因是什么?

我初始化的小摘录:

TcpClient client = new TcpClient(); 
client.Connect("XXXXX -- some ip", 25000); 
client.NoDelay = true; 
NetworkStream clientStream = client.GetStream(); 

而且,一切似乎是工作的罚款(包括它发送来回时间量),这完美的作品使用127.0.0.1时,但是当把它放在另一台LAN计算机上,我开始得到10048错误。

初始化它有什么问题吗?还有什么可能导致客户端的这个错误?

回答

9

请参阅http://msdn.microsoft.com/en-us/library/e160993d%28v=VS.90%29.aspx 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大师。

+0

我接着说:client.LingerState =新LingerOption(假,0);'和用netstat,你的权利,我有TIME_WAIT连接的废话负荷 – Earlz 2010-03-29 20:46:27

+0

我的意思是,在添加'LingerState'后,我仍然有很多TIME_WAIT位 – Earlz 2010-03-29 20:48:12

+0

ReuseAddr也没有帮助。 – Earlz 2010-03-29 21:37:27

0
+0

如果这是原因,那么当我使用本地主机时它如何正常工作? – Earlz 2010-03-29 21:37:56

+1

@Earlz:可能是因为127.0.0.1上的连接使用非常低(0?)的最大段寿命,因为我们实际上无法获得漫游数据包。我无法通过Google搜索找到任何内容,但它是有道理的。你可以尝试使用一个接口IP,看看它是否能够在本地机器上重现 - 尽管这也可能被优化。也可以在服务器上查看将TcpTimedWaitDelay设置为30秒(http://msdn.microsoft.com/zh-cn/library/ms819739.aspx),如果可以的话 – 2010-03-29 22:42:37

相关问题