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 展开
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 展开
2个回答
展开全部
不对,不对!!!!
改如下:
//应该 包长 == 包长度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
}
}
改如下:
//应该 包长 == 包长度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
}
}
展开全部
//应该 包长 == 包长度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
}
}
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
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询