2011-01-03 25 views
13

TCP bağlantısını aşağıdaki kodla sınamaya çalışıyorum.TCP bağlantı zaman aşımını sınama nasıl ayarlanır?

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

IP veya bağlantı noktası geçersizse zaman aşımı nasıl belirlenir? bunu başarmak için doğrudan bir yolu yoktur

+5

[bunu yapmak için iyi bir yol var gibi görünüyor.] (Http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/2281199d-cd28-4b5c-95dc -5a888a6da30d /) –

+0

Bu mümkün değil. Zaman aşımı sadece gönderim işlemleri için ayarlanabilir. Kendi zaman aşımı mekanizmanızı uygulamak mümkündür ancak daha uzun zaman aşımı değerleri elde edemezsiniz. – Mervin

cevap

15

Bunu yapmak için yerleşik bir yol yoktur. Uygulamamızın birçoğu için aşağıdaki kodu kullanıyorum. Kod hiçbir şekilde orijinal değil ama iyi çalışıyor. Lütfen bu işleve yeniden denemeler eklemeniz gerekebileceğini unutmayın ... bazen sunucu çalışır durumda olsa bile yanlış döner. OP ama yine de aramadan bu sayfayı bulmak başka biri için kullanıma sahip oldukları

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

Merhaba, kodu için 2 soru var Kullanılması planlanıyor mu? 2. Kod örneğini denediğimde, socket.Close() öğesinden hemen sonra bir ObjectDisposedException alıyorum. Ne olabilir? – Offler

+0

Değişken başarısının hiçbir faydası yok ... Örnek olarak çalıştığım kod parçalarını aldım. Genel fikir burada bir uyumsuz bağlantı başlatmanız ve bağlantının başarılı veya zaman aşımına uğramasını beklemenizdir. Daha sonra soketin bağlı durumunu kontrol edersiniz. – Saibal

10

, ama bir yolu bağlantısını test edecek bir ayrı yöntemi olması olabilir yapmak.

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; 
      } 
     } 
Bu yöntem, belirtilen süre bekleyeceğini bir waitHandle kullanacağı

bağlantısı zamanla bağlı alırsa, bu bağlantıyı kapatıp return true, aksi halde bir zaman aşımı ve dönüş olur olur, kurulan almak için yanlış.

+0

Bu yöntem aslında harika değil çünkü bir bağlantı hatası oluşturulabilir. Kullanılmayan değişken başarıdır Ne için: 1. http://social.msdn.microsoft.com/Forums/en-US/313cf28c-2a6d-498e-8188-7a0639dbd552/tcpclientbeginconnect-issue –

8

Çok çok geç, sen .Net 4.5 tanıtılan asenkron programlama özelliklerini kullanarak bunu çözebiliriz.

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

Bu, ancak Bekle yöntemi iş parçacığını kilitler. – ozziwald

İlgili konular