2011-01-03 16 views
13

मैं निम्नलिखित कोड के साथ टीसीपी कनेक्शन का परीक्षण करने का प्रयास करता हूं।टेस्ट टीसीपी कनेक्शन टाइमआउट कैसे सेट करें?

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

आईपी या पोर्ट अमान्य होने पर समय निर्धारित करने के लिए कैसे करें?

+5

[ऐसा लगता है वहाँ ऐसा करने का कोई अच्छा तरीका है की तरह।] (Http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/2281199d-cd28-4b5c-95dc -5a888a6da30d /) –

+0

यह संभव नहीं है। टाइमआउट केवल भेजने के संचालन के लिए समायोजित किया जा सकता है। अपने स्वयं के टाइमआउट तंत्र को लागू करना संभव है लेकिन आप लंबे समय तक मूल्य प्राप्त नहीं कर सकते हैं। – Mervin

उत्तर

15

ऐसा करने के लिए कोई रास्ता नहीं बनाया गया है। मैं अपने कई आवेदनों के लिए निम्नलिखित कोड का उपयोग करता हूं। कोड मूल रूप से मूल नहीं है लेकिन ठीक काम करता है। कृपया ध्यान दें कि आपको इस फ़ंक्शन में रीट्रीज़ जोड़ना पड़ सकता है ... कभी-कभी सर्वर चालू होने और चलने पर भी यह झूठा होता है।

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

हाय, मेरे पास कोड के लिए 2 प्रश्न हैं: 1. अप्रयुक्त चर सफलता के लिए क्या है इस्तेमाल करने की योजना बनाई? 2. अगर मैं आपके कोड उदाहरण का प्रयास करता हूं, तो मुझे सॉकेट के बाद ऑब्जेक्ट डिस्प्ले अपवाद प्राप्त होता है। बंद करें()। यह क्या हो सकता है? – Offler

+0

परिवर्तनीय सफलता का कोई उपयोग नहीं है ... मैंने अभी कोड के कुछ हिस्सों को लिया है कि मैं एक उदाहरण के रूप में काम कर रहा था। यहां सामान्य विचार यह है कि आप एक एसिंक कनेक्ट शुरू करते हैं और कनेक्शन सफल होने या समय समाप्त होने तक प्रतीक्षा करते हैं। फिर आप सॉकेट की कनेक्ट की गई स्थिति की जांच करें। – Saibal

10

इसे प्राप्त करने का कोई सीधा तरीका नहीं है, लेकिन ऐसा करने का एक तरीका एक अलग विधि हो सकता है जो कनेक्शन का परीक्षण करेगा।

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 कि विशेष समयावधि के लिये इंतजार करेंगे प्रयोग करेंगे कनेक्शन स्थापित करने के लिए, अगर यह समय में जुड़े हो जाता है, यह कनेक्शन बंद और सच्चे वापसी होगी, बाकी है, यह समय-समाप्त हुआ और बदले हैं असत्य।

+0

यह विधि वास्तव में महान नहीं है क्योंकि कनेक्शन त्रुटि उत्पन्न की जा सकती है। http://social.msdn.microsoft.com/Forums/en-US/313cf28c-2a6d-498e-8188-7a0639dbd552/tcpclientbeginconnect-issue –

8

बहुत भी ओ पी करने के लिए लेकिन बाकी अभी भी एक खोज से इस पृष्ठ को खोजने के लिए किसी को भी काम का हो देर से, तो आप इस नेट 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

यह काम करता है लेकिन प्रतीक्षा विधि धागे को ताला लगा देती है। – ozziwald

संबंधित मुद्दे