根据 MSDN 文档,无法将 Socket.SendTimeout 设置为小于 500 毫秒的值:http: //msdn.microsoft.com/en-us/library/system.net.sockets.socket.sendtimeout相同的规则适用于Socket.ReceiveTimeout(即使在 MSDN 文档中没有提到,这是真的,因为这两种情况都经过了实际测试)。
例如,如果完成套接字接收操作的时间超过 10 毫秒,是否还有其他方法可以使套接字接收操作超时?
根据 MSDN 文档,无法将 Socket.SendTimeout 设置为小于 500 毫秒的值:http: //msdn.microsoft.com/en-us/library/system.net.sockets.socket.sendtimeout相同的规则适用于Socket.ReceiveTimeout(即使在 MSDN 文档中没有提到,这是真的,因为这两种情况都经过了实际测试)。
例如,如果完成套接字接收操作的时间超过 10 毫秒,是否还有其他方法可以使套接字接收操作超时?
简单的答案是“你没有”。
Send()
并且Receive()
调用会阻塞程序的流程,直到数据被发送、接收或发生错误。
如果您想对呼叫进行更多控制,可以使用多种机制。最简单的就是使用Poll()
.
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
}
您也可以使用Select()
,BeginReceive()
或ReceiveAsync()
其他类型的行为。
我建议您阅读 Stevens 的 UNIX Network Programming 第 6 章和第 16 章,以获取有关非阻塞套接字使用的更深入信息。尽管本书的名称中有 UNIX,但 UNIX 和 Windows(以及 .net)中的整体套接字架构本质上是相同的