【问题标题】:Increase timeout for System.Net.Sockets.Socket connect增加 System.Net.Sockets.Socket 连接的超时时间
【发布时间】:2014-04-16 00:27:01
【问题描述】:

我需要允许使用 System.Net.Sockets.Socket 连接到 FTP 服务器需要很长时间 - 至少 30 秒,但可能更多。此代码总是在 20 秒后返回信号但未连接,这显然是内部默认值:

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IAsyncResult result = socket.BeginConnect("128.0.0.1", 99, null, null);
bool signalled = result.AsyncWaitHandle.WaitOne(60000, true);

【问题讨论】:

    标签: c# .net sockets timeout


    【解决方案1】:

    老问题,但我们遇到了同样的问题,所以我会在这里发布我们的解决方案。

    WaitOne 超时可用于强制低于系统默认超时,但如果您想增加超时(即超过 20 秒) case) 你必须更改底层操作系统的 TCP 设置。

    我们在 Windows 上遇到了这个问题,我们遇到了 21 秒的硬超时限制。要更改这一点,您可以使用以下 PowerShell 命令(以管理员身份运行 PowerShell 提示符):

    Set-NetTCPSetting -SettingName InternetCustom -MaxSynRetransmissions 4
    

    默认值为 2,这会产生大约 21 秒的有效 TCP 连接超时。值 3 将超时增加到大约 40 秒,将超时增加到大约 90 秒。更多信息可以找到here

    对于 Linux,请查看这篇文章: http://www.sekuda.com/overriding_the_default_linux_kernel_20_second_tcp_socket_connect_timeout

    【讨论】:

    • 增加系统默认值不是我理想的解决方案,但我不知道它甚至可能,所以我将其标记为答案。谢谢。
    【解决方案2】:

    看起来这可能就是您要查找的内容:http://www.codeproject.com/Articles/31514/Implementation-of-Connecting-a-Socket-with-Timeout

    他好像在用

    ManualResetEvent.WaitOne()
    

    在超时期间阻塞主线程。如果

    IsConnectionSuccessful
    

    为假(即未及时建立连接或回调失败),超时时会抛出异常。

    【讨论】:

    • 实际上是一样的。 AsyncCallback 方法在 20 秒后执行,然后将 ManualResetEvent 设置为已发出信号,以便主线程继续并检测到 Socket 未连接,然后抛出异常。
    猜你喜欢
    • 1970-01-01
    • 2013-08-15
    • 2018-12-08
    • 2010-10-31
    • 2013-04-08
    • 2018-04-17
    • 2016-05-08
    • 1970-01-01
    • 2019-02-27
    相关资源
    最近更新 更多