2012-02-17 122 views
6

我已將ReceiveTimout指定爲40毫秒。但接收超時需要超過500ms。我正在使用秒錶來計算時間。Socket ReceiveTimeout

代碼如下所示。

Socket TCPSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, 
           ProtocolType.Tcp); 
TCPSocket.ReceiveTimeout = 40; 

try 
{ 
    TCPSocket.Receive(Buffer); 

} catch(SocketException e) { } 
+1

請提供一些更多的代碼。 – rekire 2012-02-17 11:26:55

回答

0

我發現這一個:

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

IAsyncResult result = socket.BeginConnect(sIP, iPort, null, null); 

bool success = result.AsyncWaitHandle.WaitOne(40, true); 

if (!success) 
{   

      socket.Close(); 
      throw new ApplicationException("Failed to connect server."); 
} 
+0

我要求接收是同步而非異步的。另外,如果接收超時,我不希望套接字關閉。 – 2012-02-20 04:48:43

7

您可以同步你希望的任何超時插座上查詢。如果Poll()返回true,則可以確定您可以撥打不會阻止的Receive()

Socket s; 
// ... 
// Poll the socket for reception with a 10 ms timeout. 
if (s.Poll(10000, SelectMode.SelectRead)) 
{ 
    s.Receive(); // This call will not block 
} 
else 
{ 
    // Timed out 
} 

我建議你讀非阻塞套接字使用Stevens的UNIX網絡編程第6和第16進行更深入的信息。儘管本書的名稱中包含UNIX,但在UNIX和Windows(和.net)中,整體套接字體系結構基本相同。