Linux下非阻塞Socket发送错误返回

来源:互联网 发布:赌博网站源码带后台 编辑:程序博客网 时间:2024/06/13 12:56

项目中使用原有的网络发送代码进行数据传输,发现总是发不过去,或者发过去一部分,非常纳闷。

经过仔细排查,是Socket的send函数调用结果处理不正确造成的。

原有代码:

int SendData( char *data,int length ){int ret;int cur_pos = 0;while(cur_pos < length){ret = send(handle_,&data[cur_pos],length-cur_pos,0);if(ret==length-cur_pos)return ret;if(ret == SOCKET_ERROR){if(errno == EINPROGRESS)//这里{msleep(0);continue;}OutputDebugString("Send data error\r\n");return ret;}else{cur_pos += ret;}}return length;}

上面代码在send返回后判断返回值,并且查看errno。

我并不知道EINPROGRESS是什么意思,但是在网上查了资料也没有发现有send完去判断errno是EINPROGRESS的代码。

最后发现还是errno判断有错误。该代码成

int SendData( char *data,int length ){int ret;int cur_pos = 0;while(cur_pos < length){ret = send(handle_,&data[cur_pos],length-cur_pos,0);if(ret==length-cur_pos)return ret;if(ret == SOCKET_ERROR){if(errno == EAGAIN || errno == EINTR)//发送缓冲区已满,或者被中断了{msleep(0);continue;}if (errno == ECONNRESET){//对方已经断开了!!}return ret;}else{cur_pos += ret;}}return length;}

测试后发现,没有出现前述问题了,在解决问题的同时,学到了一些Socket方面的东西。


原创粉丝点击