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
- Socket接收问题
- socket接收汉字乱码问题
- Socket通讯消息接收问题
- SOS-关于Socket类接收的问题
- 关于socket的接收堵塞问题
- 关于socket的接收堵塞问题
- QT 3G SOCKET发送接收问题
- 关于socket的接收堵塞问题
- socket 网络接收数据问题(0X00问题)
- JAVA SOCKET服务端接收C客户端字节长度的问题
- Socket Receive数据一次性接收不全的问题
- Android平台下Socket编程中接收缓冲的问题
- 异步Socket接收数据后缓存处理问题
- mfc中socket字符接收不完整unicode问题
- Socket Receive数据一次性接收不全的问题
- 一个关于UDP socket服务端接收长度不正确的问题
- Socket接收少一个字节问题(XP系统)
- 华为P9开发Socket无法接收到消息的问题
- 一个新java工程师的成长之路
- android自定义属性
- poj 2001 Shortest Prefixes(字典树)
- opengl vbo
- 程序中涉及到时间的相关问题
- Socket接收问题
- [Dahua Lin] 概率漫谈
- 解释型语言和编译型语言的区别
- jsp的include两种使用方法
- std::vector(续)
- MD5加密算法
- Android系统在新进程中启动自定义服务过程(startService)的原理分析、Android应用程序绑定服务(bindService)的过程源代码分析
- vc mfc按钮的创建
- 主线程等待线程池所有任务完成