【问题标题】:WinSock recv() timeout: setsockopt()-set value + half a second?WinSock recv() 超时:setsockopt() - 设置值+半秒?
【发布时间】:2011-06-04 01:30:37
【问题描述】:

我正在编写一个跨平台库,除其他外,它提供了一个套接字接口,在运行我的单元测试套件时,我注意到通过 setsockopt() 设置的超时有些奇怪:在 Windows 上,阻塞recv() 调用似乎始终比通过 SO_RCVTIMEO 选项指定的时间晚大约半秒(500 毫秒)返回。

在我错过的文档中对此有任何解释吗?在网上搜索,我只能找到a single other reference 的问题 - 拥有»Windows Sockets 的人可以 网络编程« 由 Bob Quinn 和 Dave Shute 为我查找第 466 页?不幸的是,我现在只能运行我的测试 Windows Server 2008 R2,其他 Windows 版本上是否也存在同样的奇怪行为?

【问题讨论】:

    标签: windows sockets winsock


    【解决方案1】:

    来自 Jones 和 Ohlund 的 Networking Programming for Microsoft Windows

    SO_RCVTIMEO 选择值


    • 类型:int
    • 获取/设置:两者都
    • Winsock 版本:1+
    • 说明:获取或设置超时值(以毫秒为单位) 与接收数据有关 插座

    SO_RCVTIMEO 选项设置 接收阻塞超时值 插座。超时值为 以毫秒为单位的整数,表示 Winsock 接收函数需要多长时间 尝试时应该阻止 接收数据。如果您需要使用 SO_RCVTIMEO 选项,您使用 WSASocket 函数创建 套接字,您必须指定 WSA_FLAG_OVERLAPPED 作为 WSASocket 的 dwFlags 参数。 随后调用任何 Winsock 接收函数(如recv, recvfrom、WSARecv 或 WSARecvFrom) 仅阻塞一段时间 指定的。如果没有数据到达 那个时候,调用失败了 错误 10060 (WSAETIMEDOUT)。如果 接收器操作确实超时 套接字处于不确定状态 并且不应该使用。

    出于性能原因,此选项 在 Windows CE 2.1 中被禁用。如果你 尝试设置此选项,它是 默默地忽略,没有失败 返回。以前版本的 Windows CE 确实实现了这个选项。

    我认为其中的关键信息是:

    如果您需要使用 SO_RCVTIMEO 选项并且使用 WSASocket 创建套接字的函数,你 必须将 WSA_FLAG_OVERLAPPED 指定为 WSASocket 的 dwFlags 参数的一部分

    我希望这仍然有用:)

    【讨论】:

    • 感谢您的回答,但不幸的是,我使用的是socket() 而不是WSASocket(),它默认设置了重叠标志...
    【解决方案2】:

    我也有同样的问题。打算用

    patchedTimeout = max ( unpatchedTimepit - 500, 1 )

    使用 unpatchedTimepit == 850 对此进行了测试

    【讨论】:

      【解决方案3】:

      您的问题不在于 rcv 函数超时!

      如果您的应用程序有一个 while 循环来检查和接收,只需放置一个 if 语句来检查接收缓冲区的最后一个索引 '\0' 字符来检查接收字符串是否结束。

      通常,如果 rcv 函数仍在接收,则返回值是接收数据的大小。 size 可以作为缓冲区数组的最后一个索引。

         do{
             result = rcv(s,buf,len,0);
              if(buf[result] == '\0'){
                 break;
              }
          }
          while(result > 0);
      

      【讨论】:

      • 它称为空终止字符串:)
      • 不幸的是,这完全是题外话。我的问题是关于在超时情况下会发生什么,而不是关于避免在应用程序中遇到超时的方法。正如您所指出的,不应使用超时来指示传输结束,但这是基本网络编程的问题。
      猜你喜欢
      • 2014-05-19
      • 2010-12-21
      • 2015-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-14
      • 1970-01-01
      • 2014-11-14
      相关资源
      最近更新 更多