WinSock recv()超时:setsockopt() - 设置值+半秒?

时间:2011-06-04 01:30:38

标签: windows sockets winsock

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

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

2 个答案:

答案 0 :(得分:2)

来自Jones和Ohlund的Networking Programming for Microsoft Windows

  

SO_RCVTIMEO optval

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

SO_RCVTIMEO选项设置   在阻塞时接收超时值   插座。超时值是   以毫秒为单位的整数,表示   Winsock接收功能多久了   在尝试时应该阻止   接收数据。如果你需要使用   SO_RCVTIMEO选项,您使用   WSASocket函数创建   socket,你必须指定   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参数的一部分

我希望这仍然有用:)

答案 1 :(得分:0)

我遇到了同样的问题。要使用

patchedTimeout = max(unpatchedTimepit - 500,1)

使用unpatchedTimepit == 850

进行测试