我需要允许使用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);
答案 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失败),当时间用完时,将抛出异常。