您的位置:首页 > 运维架构 > Linux

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

2012-04-21 15:32 543 查看
项目中使用原有的网络发送代码进行数据传输,发现总是发不过去,或者发过去一部分,非常纳闷。

经过仔细排查,是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方面的东西。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: