TcpClient как задать таймаут для установки соединения - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день Возникла проблема. При установке соединения с хостом на закрытый порт - поток висит 23 секунды и ждёт ответа от удаленного хоста. (отправляет SYN , после чего ждет SYN ACK целых 23 секунды!) как задать это время таймаута? чтобы было не 23 секунды а хотя бы 1 секунда ? есть какие-то может другие способы ? нужно проверить быстро доступность порта. через несколько потоков не пойдет. так как хостов много Благодарю за помощь
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
//...
источник http://stackoverflow.com/questions/1...onnect-timeout

Решение задачи: «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!");
            }
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.333 из 5
Похожие ответы