Тайм-аут при попытке подключения TCP - PullRequest
1 голос
/ 05 ноября 2011

В C # я пытаюсь проверить подключение к порту, как это:

Socket socket = new Socket(AddressFamily.InterNetwork,
                    SocketType.Stream,
                    ProtocolType.Tcp);

socket.Connect(telco.Address, telco.Port);

Отлично работает, когда порт доступен.Однако, когда порт недоступен (например, google.com в TCP / 81), для его истечения требуется много времени (~ 60 секунд).Это для страницы состояния, поэтому я хочу относительно быстро потерпеть неудачу.

Я попытался установить для socket.SendTimeout и socket.RecieveTimeout значение 5000 мс (5 секунд), но, похоже, это не дает никакого эффекта.

Ответы [ 3 ]

1 голос
/ 05 ноября 2011

Я закончил с кодом, похожим на этот, чтобы сохранить простоту:

Socket socket = new Socket(AddressFamily.InterNetwork,
                    SocketType.Stream,
                    ProtocolType.Tcp);

IAsyncResult result = socket.BeginConnect(telco.Address, telco.Port, null, null);

bool connectionSuccess = result.AsyncWaitHandle.WaitOne(5000, true);
0 голосов
/ 05 ноября 2011

Чтобы точно контролировать время ожидания, сделайте следующее:

  • запустите один поток с кодом выше
  • после запуска потока и попытки подключения к сокету, сделайте то, что вам нужно (то есть то, на что у вас есть немного времени, по крайней мере Application.DoEvents()
  • Thread.Sleep() для желаемого интервала времени ожидания, или используйте другой метод, чтобы проход времени
  • проверял, открыто ли соединениеиз вашего основного потока. Вы можете сделать это, наблюдая некоторую переменную состояния, которую вы установите после успешного установления соединения.
  • , если это так, используйте соединение. Если нет, используйте Socket.Close() в вашем ожидающем сокете, чтобыпрервите попытку подключения.

Да, вы получите исключение в потоке, который пытается подключиться, но вы можете смело сожрать его и предположить, что все в порядке.

http://msdn.microsoft.com/en-us/library/wahsac9k(v=VS.80).aspx Socket.Close()

0 голосов
/ 05 ноября 2011

думаю, что вы ищете сокет. ReceiveTimeout ();

или используйте beginConnect () и используйте инструмент синхронизации, такой как AutoResetEvent, чтобы перехватить время.

см. Этот пост: Как настроить время ожидания подключения к сокету

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...