Linux下非阻塞Socket发送错误返回
linux-dash
A beautiful web dashboard for Linux
项目地址:https://gitcode.com/gh_mirrors/li/linux-dash
免费下载资源
·
项目中使用原有的网络发送代码进行数据传输,发现总是发不过去,或者发过去一部分,非常纳闷。
经过仔细排查,是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方面的东西。
GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e
added ecosystem file for PM2 4 年前
5def40a3
Add host customization support for the NodeJS version 4 年前
更多推荐
已为社区贡献1条内容
所有评论(0)