我已将ReceiveTimout
指定为40毫秒。但是接收超时需要500ms以上。我正在使用秒表来计算时间戳。
代码如下所示。
Socket TCPSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
TCPSocket.ReceiveTimeout = 40;
try
{
TCPSocket.Receive(Buffer);
} catch(SocketException e) { }
答案 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毫秒的超时值。
请参阅此处了解SendTimeout
:http://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.");
}