Socket接收问题

6 篇文章 0 订阅

sokcet接收一个包货是n个包的示例

CGroupInfo* BLL::GetGroups(int startPos,int size,int &err)
{
	CGroupInfo* groups = NULL;
	unsigned short lenSend = 0;
	CGroupView view(startPos,size);
	char* data = view.write(lenSend);
	Msg gMsg(data,lenSend,MSGTYPE::GROUP_VIEW);
	char* dataSend = gMsg.write(lenSend);
	CBlockingSocket blockingSocket;	
	bool nReturn = true;
	//连接服务器
	if(!(nReturn = blockingSocket.Open(serverIP.c_str(),serverPortForCreate)))
	{
		return groups; //连接服务器失败
	}
	//发送请求信息
	if(!(nReturn = blockingSocket.Send(dataSend,lenSend)))
	{
		err = -2;
		return  groups; //发送请求信息失败
	}
	//接收带有实际数量的GroupViewMsg,从option中取
	const int MAX_BUF = 20*2;
	char recvbuf[MAX_BUF];   //这一次获取的字节
	char nextbuf[MAX_BUF*2];  //这一次留下的字节
	char nowbuf[MAX_BUF*2];  //这一次总的字节
	int iRet;      //这一次获取的字节数
	int nRet = 0;  //之前没有放入Msg中的字节数
	int r=0; //读取到Msg中剩余字节数
	Msg msg;
	//接收一个包
	do
	{
		iRet = 0;
		if(nRet>0)
			memcpy(nowbuf,nextbuf,nRet);
		if(r<=0)
		{
			iRet=blockingSocket.Read(recvbuf,lenSend);
			if(iRet<=0)
			{
				err = -3;
				return  groups; //接收失败
			}
			memcpy(nowbuf+nRet,recvbuf,iRet);
		}
		r = msg.read(nowbuf,iRet+nRet);
		if(r==0)
			nRet = 0;
		if(r>0)//多收了几个包 这种情况不应该出现,暂时不考虑
		{
			nRet = nRet + iRet-msg.getTotalLen();
			memcpy(nextbuf, nowbuf+msg.getTotalLen(),nRet);	
			err = -4;  //这种情况,按理不应该出现
			return  groups;
		}
		if(r<0) //一个包没收完
		{
			nRet = nRet + iRet;
			memcpy(nextbuf, nowbuf,nRet);
			continue;  //由于只收一个,所以有此句,要是多收了反而不合理
		}
	}while(r!=0);  //接收一个包

	//判断
	if(!gMsg.equalsIgnoreOption(msg))
	{
		err = -5;  //这种情况,按理不应该出现
		return  groups;
	}
	err = 0;
	int count = msg.getOption(),num1 = 0;
	const int MAX_BUF1 = 1200*2;
	char recvbuf1[MAX_BUF1];   //这一次获取的字节
	char nextbuf1[MAX_BUF1*2];  //这一次留下的字节 注意:nextbuf和nowbuf的空间大小得比recvbuf大才可以,否则r1<0后再掉read函数后nowbuf1会溢出,从而造成groups变成空
	char nowbuf1[MAX_BUF1*2];  //这一次总的字节
	int iRet1;      //这一次获取的字节数
	int nRet1 = 0;  //之前没有放入Msg中的字节数
	int r1=0; //读取到Msg中剩余字节数
	Msg msg1;
	if(count==0)
	{
		return  groups;   //系统还没有组
	}
	else
	{
		err = count;
		groups = new CGroupInfo[count];
		//接收count条消息	
		do
		{
			iRet1 = 0;
			if(nRet1>0)
				memcpy(nowbuf1,nextbuf1,nRet1);
			if(r1<=0)
			{
				iRet1=blockingSocket.Read(recvbuf1,MAX_BUF1);  
				if(iRet1<=0)
				{
					err = -3;
					groups = NULL;
					return  groups; //接收失败
				}
				memcpy(nowbuf1+nRet1,recvbuf1,iRet1);
			}
			r1 = msg1.read(nowbuf1,iRet1+nRet1);
			CGroupInfo group;
			if(r1==0)
			{
				nRet1 = 0;
				int dataLen = 0;
				group.read(msg1.getData(dataLen),msg1.getTotalLen()-msg1.getHeaderLen());
				groups[num1]=group;
				num1++;
			}
			if(r1>0)//多收了几个包
			{
				nRet1 = nRet1 + iRet1-msg1.getTotalLen();
				memcpy(nextbuf1, nowbuf1+msg1.getTotalLen(),nRet1);	
				int dataLen = 0;
				group.read(msg1.getData(dataLen),msg1.getTotalLen()-msg1.getHeaderLen());
				groups[num1]=group;
				num1++;
				//由于num1!=count的条件限制也许不需要再次调用Read
			}
			if(r1<0) //一个包没收完
			{
				nRet1 = nRet1 + iRet1;
				memcpy(nextbuf1, nowbuf1,nRet1);
			}
		}while(num1!=count);
		return  groups; 
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值