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

时间:2014-03-12 04:12:07

标签: c# .net 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);

2 个答案:

答案 0 :(得分:2)

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

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

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

Set-NetTCPSetting -SettingName InternetCustom -MaxSynRetransmissions 4

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

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

答案 1 :(得分:0)

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

似乎他正在使用

ManualResetEvent.WaitOne()

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

IsConnectionSuccessful

为假(即连接未及时或callBack失败),当时间用完时,将抛出异常。