2014-03-12 2 views
3

Мне нужно разрешить подключения к FTP-серверу с использованием System.Net.Sockets.Socket, чтобы занять много времени - не менее 30 секунд, но, возможно, больше. Этот код всегда возвращается как сигнал, но не подключен через 20 секунд, что, по-видимому внутренняя по умолчанию:Увеличьте время ожидания для System.Net.Sockets.Socket connect

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

Старый вопрос, но у нас была такая же проблема, поэтому я отправлю наше решение здесь.

Таймаут WaitOne может быть использован, чтобы заставить нижнюю тайм-аут, чем в системе по умолчанию, но если вы хотите увеличение тайм-аут (то есть более чем на 20 секунд в вашем случае), вы должны изменить настройки TCP базовой операционной системы.

Мы столкнулись с этой проблемой в Windows, где мы столкнулись с жестким тайм-аутом на 21 секунду. Чтобы изменить это, вы можете использовать следующую команду PowerShell (работает в строке PowerShell, как администратор):

Set-NetTCPSetting -SettingName InternetCustom -MaxSynRetransmissions 4 

Значение по умолчанию равно 2, что дает эффективный тайм-аут соединения TCP около 21 секунд. Значение 3 увеличивает время ожидания до 40 секунд и от 4 до 90 секунд. Более подробную информацию можно найти here.

Для Linux, проверить эту статью: http://www.sekuda.com/overriding_the_default_linux_kernel_20_second_tcp_socket_connect_timeout

+0

Увеличение системного дефолта не является моим идеальным решением, но не знало, что это возможно, поэтому я отмечу это как ответ. Благодарю. – Bert

0

Похоже, это может быть то, что вы ищете: http://www.codeproject.com/Articles/31514/Implementation-of-Connecting-a-Socket-with-Timeout

Кажется, что он использует

ManualResetEvent.WaitOne() 

, чтобы заблокировать основной поток в течение таймаута. Если

IsConnectionSuccessful 

ложна (т.е. соединение не было сделано вовремя или CallBack не удалось), когда истечет время, исключение будет выброшено.

+0

Пришло фактически то же самое. Метод AsyncCallback выполняется через 20 секунд, а затем устанавливает значение ManualResetEvent, поэтому основной поток продолжается и обнаруживает, что Socket не подключен, а затем выбрасывает exeception. – Bert

Смежные вопросы