首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >setsockopt()超时: WinSock ()-set值+半秒?

setsockopt()超时: WinSock ()-set值+半秒?
EN

Stack Overflow用户
提问于 2011-06-04 09:30:38
回答 3查看 5K关注 0票数 2

我正在编写一个跨平台库,其中包括提供套接字接口,并且在运行我的单元测试套件时,我注意到通过setsockopt()设置的超时有些奇怪:在Windows上,阻塞的recv()调用似乎总是比通过SO_RCVTIMEO选项指定的时间延迟半秒(500ms)。

在我遗漏的文档中对此有什么解释吗?在网上搜索,我只能找到这个问题的答案--谁拥有Bob Quinn和Dave Shute所著的Windows Sockets Network Programming«,能帮我查一下466页吗?不幸的是,我现在只能运行我的测试Windows Server2008Windows,同样奇怪的行为是否也存在于其他R2版本中?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-12 11:55:31

我也有同样的问题。我将使用

patchedTimeout =最大( unpatchedTimepit - 500,1)

使用unpatchedTimepit == 850进行了测试

票数 0
EN

Stack Overflow用户

发布于 2011-06-21 02:16:30

来自琼斯和奥伦德的Networking Programming for Microsoft Windows

SO_RCVTIMEO选项

套接字类型: int

  • Get/Set: Both

  • Winsock Version: 1+

  • Description :获取或设置与在socket

上接收数据相关的超时值(以毫秒为单位)

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参数的一部分

我希望这仍然有用:)

票数 2
EN

Stack Overflow用户

发布于 2022-02-26 14:26:50

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

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

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

代码语言:javascript
复制
   do{
       result = rcv(s,buf,len,0);
        if(buf[result] == '\0'){
           break;
        }
    }
    while(result > 0);
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6234086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档