socket 关于收到的消息比recv大以后,如何处理的问题

可以像以下代码这样么void*recvthread(void*sock){intrecvback;//recv返回值inthlen;//包长度boolfirsttime=... 可以像以下代码这样么

void *recvthread (void * sock)
{
int recvback ; //recv返回值
int hlen; //包长度
bool firsttime = true; //是否是这次接收数据的第一次
char recvmsg[100] ; //接收消息的数组

while(true)//进入接收循环
{
recvback = recv((int)sock,recvmsg,MAXRECVLEN,0); //接收消息

if(recvback == 0) //recv返回值为0,那么说明服务器断开连接
{
printf("The server has already disconnected~ Exit!! \n");
exit(1); //退出线程
}

if(firsttime)//如果是第一次接收
{
memcpy(&hlen,recvmsg,sizeof(int)); //翻译包长
firsttime = false; //不是第一次了

if(recvback-4 == hlen)//如果说剩下的消息等于包长
{
string raw(recvmsg+4,recvmsg+recvback); //给string型的消息赋值
msg += raw;
cout<<msg<<endl; //打印
continue; //并且继续,等带下一次服务器发送消息
}
else //如果剩下的消息不等于包长
{
hlen -= (recvback-4); //计算还剩多少
string raw(recvmsg+4,recvmsg+recvback); //把这次独得信息加上
msg += raw;
continue; //继续下一次recv
}
}

else//如果不是第一次接收
{
if(hlen == recvback)//如果剩下的信息长度等于这次接收的,则说明接收完成
{
msg += recvmsg; //把最后一段消息加上
cout<<msg<<endl; //打印出接收到的消息
continue; //并且继续,等带下一次服务器发送消息
}
else //如果声息的信息长度不等于这次接受的 ,那么接收还是未完成
{
hlen -= recvback; //计算还剩多少
msg += recvmsg; //并且把这次接收到的消息加上
continue; //继续接收没有接收完的
}
}
}
}
msg 是string
展开
 我来答
wangbwell
推荐于2016-03-07 · TA获得超过1238个赞
知道小有建树答主
回答量:490
采纳率:0%
帮助的人:730万
展开全部
不对,不对!!!!
改如下:
//应该 包长 == 包长度4个字节 + 消息的长度 也hlen==你原来hlen+sizeof(int)

void *recvthread (void * sock)
{
int nRet; //recv返回值
int nCount_Recv=0; //缓冲区recvmsg中当前recv的数据长度
int hlen; //包长度
//bool firsttime = true; //是否是这次接收数据的第一次 似乎没什么用
char recvmsg[100] ; //接收消息的数组

while(true)//进入接收循环
{
nRet = recv((int)sock,recvmsg+nCount_Recv,MAXRECVLEN-nCount_Recv,0); //注意,是怎么接收消息

if(nRet == 0) //recv返回值为0,那么说明服务器断开连接
{
printf("The server has already disconnected~ Exit!! \n");
exit(1); //退出线程
}
else if (nRet < 0)
{ //出错 自己处理 这里只是简单continue
continue;
}

nCount_Recv += nRet;

if( hlen==0)//如果hlen==0为新消息开始
{
if ( nCount_Recv >= sizeof(int) ) //不大于sizeof(int) 你翻译什么包长啊
{
memcpy(&hlen,recvmsg,sizeof(int)); //翻译包长
hlen += sizeof(int); //注意:为了方便 改了hlen 不是原来那个
if (hlen > MAXRECVLEN)
{ //包长也太长了吧 肯定无法recv
exit(1); //退出线程
}
}
else
{
continue; //连sizeof(int)的大小都不到 继续recv吧
}
}

if(nCount_Recv >= hlen)//缓冲区recvmsg中当前数据长度大于hlen 说明接受到完整消息 就处理
{
string raw(recvmsg+sizeof(int),recvmsg+hlen); //给string型的消息赋值
msg += raw;
cout<<msg<<endl; //打印
memcpy(recvmsg,recvmsg+hlen,nCount_Recv-hlen); //移动剩余数据到前面
nCount_Recv -= hlen; //减去处理掉包长作为当前的数据长度
hlen = 0; //新的包的长度为0
continue; //并且继续,等带下一次服务器发送消息
}
//其余的都继续recv
}

}
lihongwei41
2015-11-10 · TA获得超过4万个赞
知道大有可为答主
回答量:2.5万
采纳率:0%
帮助的人:5957万
展开全部
//应该 包长 == 包长度4个字节 + 消息的长度 也hlen==你原来hlen+sizeof(int)

void *recvthread (void * sock)
{
int nRet; //recv返回值
int nCount_Recv=0; //缓冲区recvmsg中当前recv的数据长度
int hlen; //包长度
//bool firsttime = true; //是否是这次接收数据的第一次 似乎没什么用
char recvmsg[100] ; //接收消息的数组

while(true)//进入接收循环
{
nRet = recv((int)sock,recvmsg+nCount_Recv,MAXRECVLEN-nCount_Recv,0); //注意,是怎么接收消息

if(nRet == 0) //recv返回值为0,那么说明服务器断开连接
{
printf("The server has already disconnected~ Exit!! \n");
exit(1); //退出线程
}
else if (nRet < 0)
{ //出错 自己处理 这里只是简单continue
continue;
}

nCount_Recv += nRet;

if( hlen==0)//如果hlen==0为新消息开始
{
if ( nCount_Recv >= sizeof(int) ) //不大于sizeof(int) 你翻译什么包长啊
{
memcpy(&hlen,recvmsg,sizeof(int)); //翻译包长
hlen += sizeof(int); //注意:为了方便 改了hlen 不是原来那个
if (hlen > MAXRECVLEN)
{ //包长也太长了吧 肯定无法recv
exit(1); //退出线程
}
}
else
{
continue; //连sizeof(int)的大小都不到 继续recv吧
}
}

if(nCount_Recv >= hlen)//缓冲区recvmsg中当前数据长度大于hlen 说明接受到完整消息 就处理
{
string raw(recvmsg+sizeof(int),recvmsg+hlen); //给string型的消息赋值
msg += raw;
cout<<msg<<endl; //打印
memcpy(recvmsg,recvmsg+hlen,nCount_Recv-hlen); //移动剩余数据到前面
nCount_Recv -= hlen; //减去处理掉包长作为当前的数据长度
hlen = 0; //新的包的长度为0
continue; //并且继续,等带下一次服务器发送消息
}
//其余的都继续recv
}

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式