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