我正在编写一个跨平台库,其中包括提供套接字接口,并且在运行我的单元测试套件时,我注意到通过setsockopt()设置的超时有些奇怪:在Windows上,阻塞的recv()调用似乎总是比通过SO_RCVTIMEO选项指定的时间延迟半秒(500ms)。
在我遗漏的文档中对此有什么解释吗?在网上搜索,我只能找到这个问题的答案--谁拥有Bob Quinn和Dave Shute所著的Windows Sockets Network Programming«,能帮我查一下466页吗?不幸的是,我现在只能运行我的测试Windows Server2008Windows,同样奇怪的行为是否也存在于其他R2版本中?
发布于 2012-01-12 11:55:31
我也有同样的问题。我将使用
patchedTimeout =最大( unpatchedTimepit - 500,1)
使用unpatchedTimepit == 850进行了测试
发布于 2011-06-21 02:16:30
来自琼斯和奥伦德的Networking Programming for Microsoft Windows:
SO_RCVTIMEO选项
套接字类型: int
上接收数据相关的超时值(以毫秒为单位)
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参数的一部分
我希望这仍然有用:)
发布于 2022-02-26 14:26:50
您的问题不在rcv函数超时!
如果您的应用程序有一个while循环要检查和接收,只需放入一条if语句来检查接收缓冲区,'\0‘的最后一个索引要检查的是接收字符串是否结束。
通常,如果rcv函数仍在接收,返回值是接收到的数据的大小。size可以作为缓冲区数组的最后一个索引。
do{
result = rcv(s,buf,len,0);
if(buf[result] == '\0'){
break;
}
}
while(result > 0);https://stackoverflow.com/questions/6234086
复制相似问题