2011-01-03 14 views
13

Intento probar la conexión TCP con el siguiente código.¿Cómo establecer el tiempo de espera de la conexión TCP de prueba?

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

Cómo establecer el tiempo de espera si la dirección IP o el puerto no son válidos?

+5

[Parece que no hay una buena manera de hacerlo.] (Http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/2281199d-cd28-4b5c-95dc -5a888a6da30d /) –

+0

No es posible. El tiempo de espera solo se puede ajustar para las operaciones de envío. Por supuesto, es posible implementar su propio mecanismo de tiempo de espera, pero no puede lograr valores de tiempo de espera más largos. – Mervin

Respuesta

15

No hay una forma integrada de hacerlo. Uso el siguiente código para muchas aplicaciones. El código no es en absoluto original, pero funciona bien. Tenga en cuenta que tal vez tenga que agregar reintentos a esta función ... a veces devuelve falso incluso cuando el servidor está funcionando.

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(); 
     } 
    } 
+0

Hola, tengo 2 preguntas para el código: 1. ¿Cuál es el éxito de la variable no utilizada? planeado para ser utilizado? 2. Si pruebo el ejemplo del código, obtengo una ObjectDisposedException justo después del socket.Close(). ¿qué puede ser? – Offler

+0

El éxito variable no tiene uso ... simplemente tomé partes del código con las que estaba trabajando como ejemplo. La idea general aquí es que inicie una conexión asíncrona y espere hasta que la conexión tenga éxito o se agote el tiempo de espera. Luego verifica el estado conectado del socket. – Saibal

10

No hay una forma directa de lograrlo, pero una forma de hacerlo puede ser tener un método independiente que pueda probar la conexión.

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; 
      } 
     } 

Este método sería utilizar un WaitHandle que esperar a que el período de tiempo especificado para obtener la conexión establecida, si se conecta en el tiempo, que cerrará la conexión y vuelta verdad, de lo contrario, sería tiempo de espera y de retorno falso.

+0

Este método en realidad no es excelente porque se puede generar un error de conexión. http://social.msdn.microsoft.com/Forums/en-US/313cf28c-2a6d-498e-8188-7a0639dbd552/tcpclientbeginconnect-issue –

8

demasiado tarde para ser de utilidad para el PO, pero para nadie más todavía la búsqueda de esta página de una búsqueda, puede resolver esto utilizando las funciones de programación asíncrona introducidas en .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 
} 
+0

Esto funciona pero el método Wait bloquea el hilo. – ozziwald

Cuestiones relacionadas