我正在编写一个跨平台的库,其中提供了一个套接字接口,在运行我的unit testing套件时,我注意到了一些有关通过setsockopt()
设置的超时的奇怪:在Windows上,阻塞recv()
调用似乎一直返回大约半秒(500毫秒)比通过SO_RCVTIMEO
选项指定晚。
在我错过的文档中是否有任何解释? 在网上search的时候,我只能find另外一个关于这个问题的参考资料 – Bob Quinn和Dave Shute所拥有的“Windows Sockets Network Programming”中的某个人是否可以为我查找第466页? 不幸的是,我现在只能运行我的testingWindows Server 2008 R2,其他Windows版本上是否也存在相同的奇怪行为?
我有同样的问题。 去使用
patchedTimeout = max(unpatchedTimepit – 500,1)
用unpatchedTimepit == 850进行测试
从Jones和Ohlund的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参数的一部分
我希望这仍然是有用的:)