5

我正在编写一个自定义 TCP 服务器和客户端,并且在执行大量请求(确切地说是 60,000 个)时,我开始收到 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 错误。

我如何初始化它有问题吗?还有什么可能导致客户端出现此错误?

4

2 回答 2

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 专家。

于 2010-03-29T20:38:59.100 回答
0

你的客户端端口用完了吗?

http://www.gavaghan.org/blog/2010/02/17/tcpip-parameter-tuning-for-rapid-client-connections/

一个可能的相关问题:Server 的单个端口(套接字)上的最大并发连接数

于 2010-03-29T20:40:00.767 回答