我正在编写一个跨平台库,除其他外,它提供了一个套接字接口,在运行我的单元测试套件时,我注意到通过setsockopt()
设置的超时有些奇怪:在Windows上,阻止recv()
调用似乎始终比通过SO_RCVTIMEO
选项指定的时间大约返回半秒(500毫秒)。
在我错过的文档中是否有任何解释?在网上搜索,我只能找到问题的a single other reference - 可能有人拥有»Windows套接字 网络编程«Bob Quinn和Dave Shute为我查找了第466页?不幸的是,我现在只能运行我的测试Windows Server 2008 R2,其他Windows版本上是否存在同样的奇怪行为?
答案 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
进行测试