7

根据 MSDN 文档,无法将 Socket.SendTimeout 设置为小于 500 毫秒的值:http: //msdn.microsoft.com/en-us/library/system.net.sockets.socket.sendtimeout相同的规则适用于Socket.ReceiveTimeout(即使在 MSDN 文档中没有提到,这是真的,因为这两种情况都经过了实际测试)。

例如,如果完成套接字接收操作的时间超过 10 毫秒,是否还有其他方法可以使套接字接收操作超时?

4

1 回答 1

9

简单的答案是“你没有”。

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)中的整体套接字架构本质上是相同的

于 2012-05-29T02:27:37.290 回答