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;
}
}