【问题标题】:Setting socket send/receive timeout to less than 500ms in .NET在 .NET 中将套接字发送/接收超时设置为小于 500 毫秒
【发布时间】:2012-05-28 14:06:36
【问题描述】:

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

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

【问题讨论】:

  • Socket.ReceiveTimeout设置为10ms有什么问题?
  • 我做了一个测试,将 Socket.ReceiveTimeout 设置为 10m。大约 500 毫秒后全部失败,所以我假设同样的规则在这里也适用,即使文档中没有提到。
  • @Ras 是的,但它会旋转一个新线程。
  • 为什么你希望超时时间小于 500 毫秒?由于延迟和潜在的网络流量远低于 500 毫秒,您可能会遇到大量错误超时。

标签: c# .net sockets


【解决方案1】:

简单的答案是“你不知道”。

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

【讨论】:

  • 非常感谢您的回答和参考。这正是我所需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 2017-10-19
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-17
相关资源
最近更新 更多