套接字ReceiveTimeout

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

代码如下所示。

 Socket TCPSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); TCPSocket.ReceiveTimeout = 40; try { TCPSocket.Receive(Buffer); } catch(SocketException e) { } 

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

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

即使MSDN没有对ReceiveTimeout说明相同的要求,我的经验表明这种限制仍然存在。

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

  • 在.NET中将套接字发送/接收超时设置为小于500毫秒
  • WinSock recv()超时:setsockopt() – 设置值+半秒?

我找到了这个:

 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."); }