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

4

我需要使用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);
2个回答

5

虽然这是一个旧问题,但我们遇到了相同的问题,因此我会在这里发布我们的解决方案。

WaitOne超时可以用来强制使用较低的超时时间,但是如果您想增加超时时间(例如,在您的情况下超过20秒),则必须更改底层操作系统的TCP设置。

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

Set-NetTCPSetting -SettingName InternetCustom -MaxSynRetransmissions 4

默认值为2,这将导致大约21秒的有效TCP连接超时。3的值将将超时时间增加到约40秒,4则为约90秒。更多信息可以在此处找到。
对于Linux,请查看该文章

增加系统默认值并不是我的理想解决方案,但我不知道这是可能的,所以我会将其标记为答案。谢谢。 - Bert

0

它们实际上是相同的。AsyncCallback方法在20秒后执行,然后将ManualResetEvent设置为已标记,以便主线程继续并检测Socket未连接,然后抛出异常。 - Bert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接