2012-02-17 81 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)中,整体套接字体系结构基本相同。