套接字ReceiveTimeout

时间:2012-02-17 11:22:53

标签: c# sockets timeout

我已将ReceiveTimout指定为40毫秒。但是接收超时需要500ms以上。我正在使用秒表来计算时间戳。

代码如下所示。

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

try
{  
    TCPSocket.Receive(Buffer);  

}  catch(SocketException e)  {  }

3 个答案:

答案 0 :(得分:8)

您可以使用所需的任何超时同步轮询套接字。如果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)中基本相同

答案 1 :(得分:2)

您不能使用小于500毫秒的超时值。 请参阅此处了解SendTimeouthttp://msdn.microsoft.com/en-us/library/system.net.sockets.socket.sendtimeout

尽管MSDN没有对ReceiveTimeout提出相同的要求,但我的经验表明这种限制仍然存在。

您还可以在几个SO帖子上阅读更多相关信息:

答案 2 :(得分: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."); 
}