TcpClient как задать таймаут для установки соединения - C#
Формулировка задачи:
Добрый день
Возникла проблема.
При установке соединения с хостом на закрытый порт - поток висит 23 секунды и ждёт ответа от удаленного хоста.
(отправляет SYN , после чего ждет SYN ACK целых 23 секунды!)
как задать это время таймаута?
чтобы было не 23 секунды а хотя бы 1 секунда ?
есть какие-то может другие способы ?
нужно проверить быстро доступность порта.
через несколько потоков не пойдет. так как хостов много
Благодарю за помощь
источник http://stackoverflow.com/questions/1...onnect-timeout
try { TcpClient tcp = new TcpClient(); int port = 80; IPAddress addr = IPAddress.Parse(currentIP); tcp.SendTimeout = 1000; tcp.ReceiveTimeout = 1000; tcp.Connect(addr, port); openPort80 = true; tcp.Close(); //MessageBox.Show("TCP Connected!"); } catch (SocketException sockEx) { openPort80 = false; //MessageBox.Show("Ошибка\n" + "Сообщение=" + sockEx.Message); } catch { }
нашел решение - если понадобиться кому-то:
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // Connect using a timeout (5 seconds) IAsyncResult result = socket.BeginConnect( sIP, iPort, null, null ); bool success = result.AsyncWaitHandle.WaitOne( 5000, true ); if ( !success ) { // NOTE, MUST CLOSE THE SOCKET socket.Close(); throw new ApplicationException("Failed to connect server."); } // Success //...
Решение задачи: «TcpClient как задать таймаут для установки соединения»
textual
Листинг программы
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { IPAddress address = IPAddress.Parse("192.168.0.100"); int port = 8010; int timeout = 2000; try { new TcpClientEx().Connect(address, port, timeout); } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadLine(); } } public class TcpClientEx : TcpClient { public void Connect(IPAddress address, int port, int timeout) { var result = base.Client.BeginConnect(address, port, null, null); while (!result.AsyncWaitHandle.WaitOne(timeout, true)) { base.Client.Dispose(); throw new Exception("Timeout error!"); } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д