Linux下非阻塞Socket发送错误返回
2012-04-21 15:32
543 查看
项目中使用原有的网络发送代码进行数据传输,发现总是发不过去,或者发过去一部分,非常纳闷。
经过仔细排查,是Socket的send函数调用结果处理不正确造成的。
原有代码:
上面代码在send返回后判断返回值,并且查看errno。
我并不知道EINPROGRESS是什么意思,但是在网上查了资料也没有发现有send完去判断errno是EINPROGRESS的代码。
最后发现还是errno判断有错误。该代码成
测试后发现,没有出现前述问题了,在解决问题的同时,学到了一些Socket方面的东西。
经过仔细排查,是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方面的东西。
相关文章推荐
- linux非阻塞的socket发送数据出现EAGAIN错误的处理方法
- linux非阻塞的socket EAGAIN的错误处理
- 我以前总是错误地以为---“阻塞socket和非阻塞socket对应的connect函数都会立即返回”
- linux非阻塞的socket EAGAIN的错误处理
- 我以前总是错误地以为---“阻塞socket和非阻塞socket对应的connect函数都会立即返回”
- linux非阻塞的socket EAGAIN的错误处理【转】
- linux非阻塞的socket EAGAIN的错误处理
- Linux下父进程通过管道发送文件名给子进程,子进程获取文件名后首先判断文件是否存在,不存在,通过管道返回错误信息,存在,将文件内容返回给父进程
- Linux - 非阻塞socket编程处理EAGAIN错误
- Linux - 非阻塞socket编程处理EAGAIN错误
- linux非阻塞的socket EGGAIN的错误处理
- linux非阻塞的socket EAGAIN的错误处理
- linux下close 掉socket 之后 阻塞的recv 不会立即返回
- linux非阻塞的socket EAGAIN的错误处理
- linux下close 掉socket 之后 阻塞的recv 不会立即返回
- socket错误使用recvfrom 返回-1的问题
- .net发送邮件:服务器响应为: 5.7.0 返回错误解决方式
- 面试题:非阻塞tcp socket调用close时缓冲区未发送数据的处理逻辑
- 从缓冲上看阻塞与非阻塞socket在发送接收上的区别
- linux网络编程中阻塞和非阻塞socket的区别