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方面的东西。
- Linux下非阻塞Socket发送错误返回
- [Linux]非阻塞模式下socket发送数据
- Linux下socket阻塞、非阻塞详解
- linux非阻塞的socket发送数据出现EAGAIN错误的处理方法
- linux socket非阻塞模式下笔记
- Linux下socket阻塞模式与非阻塞模式
- linux下socket connect非阻塞与阻塞
- Linux socket非阻塞
- linux非阻塞的socket EGGAIN的错误处理
- linux非阻塞的socket EAGAIN的错误处理
- linux非阻塞的socket EAGAIN的错误处理
- Linux - 非阻塞socket编程处理EAGAIN错误
- linux非阻塞的socket EAGAIN的错误处理
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
- socket阻塞与非阻塞情况下的recv、send、read、write返回值
- servletconfig的作用
- 【windows8开发】C++开发WinRT组件和JS调用
- 最长的存储过程
- vim 配置写c语言
- 学习计划——关于编程
- Linux下非阻塞Socket发送错误返回
- OpenCV图像扫描原理及imageData概述FAQ
- weblogic集群无法启动,提示java.lang.NumberFormatException
- 用cygwin 编译 Android 版的ffmpeg
- c++之复制构造函数为何形参是引用传递
- 社交网络营销服务商Crowdtap进军移动互联网
- sql2008数据库附加win7常见失败问题
- 手把手教你把Vim改装成一个IDE编程环境(图文)
- sprintf函数的用法