【问题标题】:Socket errors of 10048 on the client? Possible causes?客户端上的 10048 套接字错误?可能的原因?
【发布时间】:2010-03-29 20:15:36
【问题描述】:

我正在编写一个自定义 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 时效果很好,但是当将其放在另一台 LAN 计算机上时,我开始收到 10048 错误.

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

【问题讨论】:

    标签: c# networking sockets load-testing


    【解决方案1】:

    http://msdn.microsoft.com/en-us/library/e160993d%28v=VS.90%29.aspxSetSocketOption。你需要 DontLinger 或 ReuseAddr,或者两者都需要,我不确定。基本上,在您断开 TCP 连接后,您的套接字会停留在 TIME_WAIT 状态一段时间,一旦获得足够多的套接字,您将无法创建任何新的客户端连接。使用 netstat -na 程序输出验证这一点。

    您还可以通过在 注册表: 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 中有大量连接
    • 我的意思是,我添加LingerState位后还有很多TIME_WAIT
    • ReuseAddr 也无济于事。
    • 另一种方法是想办法重用连接,而不是在一个请求后将其拆除。
    【解决方案2】:

    【讨论】:

    • 如果是这个原因,那么当我使用 localhost 时它是如何工作的呢?
    • @Earlz:这可能是因为 127.0.0.1 上的连接使用非常低(0?)的最大段生命周期,因为我们真的无法获得流浪数据包。我无法通过谷歌搜索找到任何关于此的内容,但这是有道理的。您可以尝试使用接口 IP,看看这是否可以在本地机器上重现 - 尽管这也可以进行优化。如果可能的话,还请查看在服务器上将 TcpTimedWaitDelay 设置为 30 秒 (msdn.microsoft.com/en-us/library/ms819739.aspx)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    相关资源
    最近更新 更多