recvfrom,这方法如果不特意设置,默认为阻塞模式,如果一直收不到消息,那么会一直阻塞在那里。

如何设置阻塞时间,或者说如何设置recvfrom接收超时时间。可以使用setsockopt。

setsockopt()

setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&tv, sizeof(timeval));

其中有一个第三个参数可以设置为SO_RCVTIMEO,SO_SENDTIMEO。分别可以设置接收超时和发送超时。那么之后的第四个和第五个参数即为和时间相关的参数,一般使用timeval结构体。

代码示例如下:

WSADATA wsadata;
WSAStartup(0x0202, &wsadata);

SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (SOCKET_ERROR == sock)
{
cout << "socket failed" << endl;
WSACleanup();
return 0;
}

sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(9999);
addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.31");

int32_t b = bind(sock, (sockaddr*)&addr, sizeof(addr));
if (b)
{
cout << "bind failed, the error code = " << WSAGetLastError() << endl;
closesocket(sock);
WSACleanup();
return 0;
}

timeval tv = {10, 0};
b = setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&tv, sizeof(timeval));
if (b)
{
cout << "setsockopt failed" << endl;
closesocket(sock);
WSACleanup();
return 0;
}

sockaddr_in addr_from;
addr_from.sin_family = AF_INET;
int32_t len = sizeof(addr_from);

while (true)
{
char buffer[1024] = {0};
b = recvfrom(sock, buffer, 1024, 0, (sockaddr*)&addr_from, &len);
if (b <= 0)
{
cout << "recvfrom failed, the error code = %d"<< WSAGetLastError() << endl;
break;
}
}

如果超时,那么recvfrom会返回错误码为10060,解释为由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。

当然还有一个需要注意的地方,这个设置只能直接作用于recvfrom这个方法,如果说你的接收时写在线程里,并且还有一个select或者是iocp的方法来测试socket的活动,那么这个设置之后想要用来控制recvfrom超时,那么变会无效,所以使用的时候注意一下。

这个时候如果想要控制recvfrom阻塞时间的话,那么就需要另外采用方法了,我使用的方法是另起一个线程,用于监控最新一次接收消息的时间(每次收到新消息即更新一次)和当下系统时间对比,是否超出你的预设超时时间,如果超出,那么关闭socket即可。
 ———————————————— 
版权声明:本文为CSDN博主「酸辣青椒土豆丝」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010951692/article/details/38657173

关于recvfrom接收超时相关推荐

  1. STM32F0 串口接收超时

    STM32F030F4上自带的串口硬件接收超时机制,使用很方便下面就来说说. 用于设定超时时间函数 USART_SetReceiverTimeOut( USARTx,  USART_ReceiverT ...

  2. linux c udp接收超时设置

    在开线程.udp转发.单线程的循环处理等应用中,对udp的接收超时的检测和跳过是十分有必要的.以下是对udp socket的设置.直接加入创建的socket后面即可. struct timeval t ...

  3. Tcp设置发送和接收超时

    linux和windows下用setsockopt设置SO_SNDTIMEO,SO_RCVTIMEO的参数的一点区别 UDP的socket在某些情况:如对方关闭时,本地可能sendto不出去数据,然后 ...

  4. 接收超时死信的死信交换机

    在consumer服务的SpringRabbitListener中,定义一个新的消费者,并且声明 死信交换机.死信队列: @RabbitListener(bindings = @QueueBindin ...

  5. 【WCF】 套接字连接已中止。这可能是由于处理消息时出错或远程主机超过接收超时或者潜在的网络资源问题导致的。本地套接字超时是“00:00:56.9810000”。...

    如果您遇到如题所示异常提示,恭喜您找对地方了! 出现这种问题一般是由WCF的安全机制导致的,这种情况一般只会出现在NetTcpBinding的情况下,你会发现将WCF服务与本机置于同一台机上,无论客户 ...

  6. 中控门禁无法添加设备,提示表结构不存在或接收超时

    下午供应商给我打通话说新安装了10几个门禁机,但无法添加到现在的门禁管理系统,用他们测试的门禁系统机器可以正常添加的. 折腾一个下午排查网络问题,后来注意到可能是软件版本的问题. 网上有说可能是门禁机 ...

  7. 使用setsockopt()接口,设置TCP的接收与发送超时,Invalid argument错误问题

    使用TCP套接字时,当无网络连接时,还会继续send,继续recv阻塞,知道TCP自己协议机制判断断开连接时才会停止发送和接收,时间需要几分钟之久. 解决的办法是,自己设置接收超时时间,当超时后重新发 ...

  8. recv, recvfrom, recvmsg

    recv,recvfrom,recvmsg函数用于从套接字接收信息. ssize_t recv (int s, void *buf, size_t len, int flags); ssize_t r ...

  9. linux设置send时间,[转]Socket 的send,recv在windows与linux下的超时设置

    从昨天到今天一真在搞这个网络断线检测的问题,一直没搞好,网上大多都说用ping 可以搞定,不过我就是搞不定,没办法之下想了个不是办法的办法,在 服务器上开了一个 UDP端口,监听数据,然后回发,不用T ...

最新文章

  1. php 上下位置居中,CSS_css中position:fixed实现div在窗口上下左右居中,上下左右 居中 代码如下 复制 - phpStudy...
  2. RStudio中为R创建Notebook文件
  3. C#串口上位机软件--IOT串口调试精灵
  4. 05: zabbix 监控配置
  5. Linux系统下MySQL数据库的备份和恢复
  6. Linux文件预读对系统的影响
  7. vue-router思维导图
  8. MFC中OnCtlColor的用法(改变控件颜色)
  9. MyEclipse配置Tomcat 6
  10. 线下社群要如何拉新呢?
  11. EDUCoder编程练习题解(一维数组和二维数组)
  12. 国外稳定的免费PHP空间byethost.com
  13. sql字符串拼接,转义
  14. excel宏计算机,Excel怎么设置宏 Excel宏设置图文教程-电脑教程
  15. 10 网站可用性的度量与考核
  16. android 删除短信无效,android删除短信(绕过权限)
  17. “ 骗 ”分指南——对于蓝桥你不得不知的应试技巧(文末发送礼包)
  18. 路由器DMZ简单解说
  19. Leaflet中Maker碰撞监测
  20. 多想别人学习。增强编程能力。

热门文章

  1. 1、张龙netty学习 第一个netty服务端
  2. Redis——大Key问题
  3. Python实现BP神经网络ANN单隐层回归模型项目实战
  4. 2020微信的小动作整理:微信生态将进一步完善,也是电商进一步发展的机遇
  5. DES加密解密kotlin版
  6. swift swiftJson 解析json
  7. BCB(C++ Builder)创建动态库(DLL,接口导出和调用),动态加载DLL
  8. 查看服务器操作系统版本信息,查看服务器操作系统版本信息
  9. 顺序表的基本操作——初始化表
  10. 软考中级哪个含金量高?我该如何选择?