在.NET中将套接字发送/接收超时设置为小于500毫秒

时间:2012-05-28 14:06:36

标签: c# .net sockets

根据MSDN文档,无法将Socket.SendTimeout设置为小于500毫秒的值:http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.sendtimeout同样的规则对Socket.ReceiveTimeout有效(即使在MSDN文档中没有提及,这是真的,因为两个案例都进行了实际测试。)

是否有任何其他方法可以超时套接字接收操作(例如,完成时间超过10毫秒)?

1 个答案:

答案 0 :(得分: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网络编程第6章和第16章,以获取有关非阻塞套接字使用情况的更深入信息。尽管本书的名称中包含UNIX,但整体套接字体系结构在UNIX和Windows(和.net)中基本相同