Socket接收问题

来源:互联网 发布:外贸平台 知乎 编辑:程序博客网 时间:2024/04/28 00:42

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

0 0