2015-05-22 9 views
6

जब प्रोग्रामिंग एक TCP सर्वर मैं ग्राहक से अनुरोध पढ़ने के लिए समय समाप्ति की अवधि निर्धारित करने के लिए करना चाहते हैं:TcpClient.ReceiveTimeout बनाम NetworkStream.ReadTimeout का उपयोग कब करें?

var tcpClient = tcpListener.AcceptTcpClient(); 
var networkStream = tcpListener.GetStream(); 

tcpClient.ReceiveTimeout = 10000; 
networkStream.ReadTimeout = 10000; 

अंतिम दो पंक्तियों को देखें। मुझे कौन सा पसंद करना चाहिए? क्या वे प्रभावशीलता के मामले में बराबर हैं या वे किस तरह से भिन्न होते हैं?

उत्तर

5

मुझे कौन सा पसंद करना चाहिए?

पूर्व और बाद वाले दोनों अपने आंतरिक Socket प्राप्त समय समाप्ति पर सेट करेंगे। उसी सॉकेट TcpClient से NetworkStream पर बबल होगा, इसलिए मैं पूर्व के साथ जाऊंगा।

क्या वे प्रभावशीलता के मामले में समान हैं या किस तरह से वे भिन्न हैं?

यह अच्छी बात है कि हम source code देख सकते हैं। यह TcpClient.ReceiveTimeout है:

public int ReceiveTimeout 
{ 
    get 
    { 
     return numericOption(SocketOptionLevel.Socket, 
          SocketOptionName.ReceiveTimeout); 
    } 
    set 
    { 
     Client.SetSocketOption(SocketOptionLevel.Socket, 
          SocketOptionName.ReceiveTimeout, value); 
    } 
} 

कौन सा अफसर ग्राहक सॉकेट का समय समाप्त प्राप्त (Client प्रकार Socket की है) तय करता है। और फिर NetworkStream के लिए पारित:

public NetworkStream GetStream() 
{ 
    // Shortened for brevity 
    if (m_DataStream==null) 
    { 
     m_DataStream = new NetworkStream(Client, true); 
    } 
    return m_DataStream; 
} 

और जब NetworkStream टाइमआउट के लिए लग रहा है, यह Socket अंदर दिखता है:

public override int ReadTimeout 
{ 
    get 
    { 
     int timeout = (int)m_StreamSocket.GetSocketOption(SocketOptionLevel.Socket, 
                  SocketOptionName.ReceiveTimeout); 
     if (timeout == 0) 
     { 
      return -1; 
     } 
    } 
    return timeout; 
} 
+1

यह समझ में आता है। आपके उत्तर के लिए धन्यवाद। –

+0

@DioF आपका स्वागत है। –

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