关于recvfrom接收超时

232 篇文章 3 订阅
43 篇文章 0 订阅
    

关于recvfrom接收超时

标签: socket
671人阅读 评论(0) 收藏 举报
本文章已收录于:
分类:

  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即可。

0
0
 
 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值