网上很多人说收到EAGAIN错误时,直接再次接收就行了, 但是我认为这样可能会有问题,最好是做个记数器,如果多次收到EAGAIN ,就关闭socket,重新连接,这样应该万万无一失!
210203 06:03:31> CH6 recv() error:11
210203 06:03:31> CH7 recv() error:11
210203 06:03:31> CH6 AV3连接断开
210203 06:03:31> CH7 AV3连接断开
210203 06:03:31> CH2 recv() error:11
210203 06:03:31> CH4 recv() error:11
210203 06:03:31> CH1 recv() error:11
210203 06:03:31> CH2 AV3连接断开
210203 06:03:31> CH4 AV3连接断开
210203 06:03:31> CH1 AV3连接断开
210203 06:03:31> CH3 recv() error:11
210203 06:03:31> CH3 AV3连接断开
210203 06:03:32> CH5 recv() error:11
210203 06:03:32> CH5 AV3连接断开
210203 06:03:46> request video 6 stream
210203 06:03:46> request video 7 stream
查询error 11就是EAGAIN错误,网上说了一大堆,什么非阻塞调用阻塞BBBBBBBBB等,这些都不重要, again是再来一次的意思,就再试一次就行了,1次不行就试多次,还不行,就推倒重来。
WHILE(1)
{ int rcv_len = recv(p_ch->sock_tcp, recv_buf, sizeof(recv_buf), 0);
if(rcv_len == -1)
{
LOG_F(“CH%d recv() error:%d\n”, p_ch->channel, errno);
if(EINTR == errno) //EINTR: recv函数是由于程序接收到信号后返回的, 不应close掉socket连接
continue;
else if(EAGAIN == errno) //EAGAIN: 增加处理EAGIN情况###### Wed Feb 3 09:11:04 CST 2021
{
p_ch->EAGAIN_cnt++;
if(p_ch->EAGAIN_cnt > 5)
{
p_ch->EAGAIN_cnt = 0;
p_ch->sta_tcp = TCP_CLOSE;
break;
}
}
else{
p_ch->sta_tcp = TCP_CLOSE;
break;
}
}
}
今天的文章recv failed_ea端apex启动失败分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/69931.html