增加 System.Net.Sockets.Socket 连接的超时

Ber*_*ert 4 .net c# sockets timeout

我需要允许使用 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);
Run Code Online (Sandbox Code Playgroud)

Eri*_*ebo 5

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

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

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

Set-NetTCPSetting -SettingName InternetCustom -MaxSynRetransmissions 4
Run Code Online (Sandbox Code Playgroud)

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

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