中易网

socket关闭后为什么recv不返回

答案:2  悬赏:70  
解决时间 2021-02-14 02:10
socket关闭后为什么recv不返回
最佳答案
recv是socket编程中最常用的函数之一,在阻塞状态的recv有时候会返回不同的值,而对于错误值也有相应的错误码,分别对应不同的状态,下面是我针对常见的几种网络状态的简单总结。 首先阻塞接收的recv有时候会返回0,这仅在对端已经关闭TCP连接时才会发生。 而当拔掉设备网线的时候,recv并不会发生变化,仍然阻塞,如果在这个拔网线阶段,socket被关掉了,后果可能就是recv永久的阻塞了。 所以一般对于阻塞的socket都会用setsockopt来设置recv超时。 当超时时间到达后,recv会返回错误,也就是-1,而此时的错误码是EAGAIN或者EWOULDBLOCK,POSIX.1-2001上允许两个任意一个出现都行,所以建议在判断错误码上两个都写上。 如果socket是被对方用linger为0的形式关掉,也就是直接发RST的方式关闭的时候,recv也会返回错误,错误码是ENOENT 还有一种经常在代码中常见的错误码,那就是EINTER,意思是系统在接收的时候因为收到其他中断信号而被迫返回,不算socket故障,应该继续接收。但是这种情况非常难再现,我尝试过一边一直在不停的发信号,一边用recv接收数据,也没有出现过。这种异常错误我附近只有一个朋友在用write的时候见到过一次,但是总是会有概率出现的,所以作为完善的程序必须对此错误进行特殊处理。 一般设置超时的阻塞recv常用的方法都如下: while(1) { cnt = (int)recv(m_socket, pBuf,RECVSIZE, 0); if( cnt >0 ) { //正常处理数据 } else { if((cnt<0) &&(errno == EAGAIN||errno == EWOULDBLOCK||errno == EINTR)) //这几种错误码,认为连接是正常的,继续接收 { continue;//继续接收数据 } break;//跳出接收循环 } } 阻塞与非阻塞recv返回值没有区分,都是 <0 出错 =0 连接关闭 >0 接收到数据大小。 Linux环境下,须如下定义:struct timeval timeout = {3,0}; //设置发送超时 setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(struct timeval)); //设置接收超时 setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(struct timeval));
全部回答
返回-1时,用wsagetlasterror()来查看一下结果,应该是有点问题
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
怎么把word文档的01 02什么的都换成第一 第二
电脑绣花底线用松紧怎么做能让皱的效果好?
大苏庄村地址在哪,我要去那里办事
黄山市辰元银苑山庄这个地址在什么地方,我要
本田雅阁9代怎么换灯泡
高层消防前室门洞尺寸有强制要求吗
衣之秀服饰在哪里啊,我有事要去这个地方
一个变形金刚战刃黄现在多少钱。
赞华堂咏春拳馆地址有知道的么?有点事想过去
品茗软件怎样看已经布置了的钢筋图
当法军上尉让那个小女孩喝水时,母亲的举动与
华硕P8Z77 BIOS设置里怎么给CPU加压
有什么自然之道的规律
我想知道河北省保定高碑店市泗庄镇北黄垡村张
新宝来冷车启动不顺畅
推荐资讯
三本补录分数线
哪位高人可以帮我 行测考试中资料分析的网状
小升初试卷
会计证可以借个他人注册公司吗
形容吴邪小奸商性格的话怎么说来着?好像也是
有关寄信的作文600
千千服装店这个地址在什么地方,我要处理点事
g8502在北广场还是南广场上车。谢谢!!!
沈阳违停罚款的滞纳金从什么时候开始计算?
限选课学分不够,会留一年吗?
伤残鉴定没有出来我办出院会不会影响以后赔款
皇明太阳能(马湖路)这个地址在什么地方,我要
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?