Подтвердить что ты не робот

Как установить время ожидания TCP-соединения?

Я пытаюсь проверить соединение TCP со следующим кодом.

System.Threading.Thread t = new System.Threading.Thread(() =>
{      
    using (TcpClient client = new TcpClient())
    {
        client.Connect(ip, Convert.ToInt32(port));
    }
});
t.Start();

Как установить тайм-аут, если IP или порт недействительны?

4b9b3361

Ответ 1

Нет встроенного способа сделать это. Я использую следующий код для многих наших приложений. Код отнюдь не оригинален, но работает нормально. Обратите внимание, что вам может потребоваться добавить повторы к этой функции... иногда она возвращает false, даже когда сервер запущен и работает.

  private static bool _TryPing(string strIpAddress, int intPort, int nTimeoutMsec)
    {
        Socket socket = null;
        try
        {
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontLinger, false);


            IAsyncResult result = socket.BeginConnect(strIpAddress, intPort, null, null);
            bool success = result.AsyncWaitHandle.WaitOne(nTimeoutMsec, true);

            return socket.Connected;
        }
        catch
        {
            return false;
        }
        finally
        {
            if (null != socket)
                socket.Close();
        }
    }

Ответ 2

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

 static bool TestConnection(string ipAddress, int Port, TimeSpan waitTimeSpan)
        {
            using (TcpClient tcpClient = new TcpClient())
            {
                IAsyncResult result = tcpClient.BeginConnect(ipAddress, Port, null, null);
                WaitHandle timeoutHandler = result.AsyncWaitHandle;
                try
                {
                    if (!result.AsyncWaitHandle.WaitOne(waitTimeSpan, false))
                    {
                        tcpClient.Close();
                        return false;
                    }

                    tcpClient.EndConnect(result);
                }
                catch (Exception ex)
                {
                    return false;
                }
                finally
                {
                    timeoutHandler.Close();
                }
                return true;
            }
        }

Этот метод будет использовать WaitHandle, который будет ждать указанного периода времени, чтобы установить соединение, если он будет подключен вовремя, он закроет соединение и вернет true, иначе он будет тайм-аут и вернет false.

Ответ 3

Слишком поздно использовать OP, но для тех, кто еще ищет эту страницу из поиска, вы можете решить эту проблему, используя функции асинхронного программирования, представленные в .Net 4.5.

var hostname = "127.0.0.1";
var port = 123;
var timeout = TimeSpan.FromSeconds(3);
var client = new TcpClient();
if (!client.ConnectAsync(hostname, port).Wait(timeout))
{
    // timed out
}