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!");
- }
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д