粘包,半包处理

int MySocketRS::MySocketReceive(server_info* this_server_info,void * pcalldecry,server_struct_point * myserverpoint,void * recvcallback)
 {

	  int ret=0;
	  RSLock(RecvSp);

	  ret=recv(this_server_info->SOCKETv,(char*)((DWORD)&this_server_info->user_server_recv->RecvData+recvpy),sizeof(revdatastrct), 0);  

	  if (ret == 0 || (ret == SOCKET_ERROR && WSAGetLastError() == WSAECONNRESET)) 
	  {
        
		 ret=-1;
	  }
	  else if(ret >0)
	  {

		   int thisretcount=ret+recvpy;
		   int yijingchuli=0;
		   revdatastrct * startrecv=(revdatastrct *)&this_server_info->user_server_recv->RecvData;
		   int allyichuli=0;
		   while((thisretcount-allyichuli)>=12)
		   {
                           startrecv=(revdatastrct*)((DWORD)startrecv+yijingchuli);
			   yijingchuli=startrecv->datalen;
			   if((thisretcount-allyichuli)<yijingchuli)//剩余数据小于一个包
			   {
				   if(allyichuli>0)
				   {
					  
					   memcpy((void*)((DWORD)&this_server_info->user_server_recv->RecvData),(void*)((DWORD)&this_server_info->user_server_recv->RecvData+allyichuli),thisretcount-allyichuli);
					   
				   }
				   
                                   recvpy=thisretcount-allyichuli;//重置接收偏移
				 
				   break;
    		   }


   			allyichuli=allyichuli+yijingchuli;
			//cout<<"地址头:"<<startrecv<<"分类"<<startrecv->datafenlei<<"正在处理长度"<<startrecv->datalen<<"\n"<<endl;
            void * thread_d=new revdatastrct;
			memset(thread_d,0,sizeof(revdatastrct));
		   
			memcpy(thread_d,startrecv,yijingchuli+1);
			int recdaima=((revdatastrct*)thread_d)->databh;
			
  
		        encry_data((void*)((revdatastrct*)thread_d)->data, ((revdatastrct*)thread_d)->datalen-sizeof(int)*3-1+10,NULL);
			recvpy=0;//重置下次数据接收偏移
                        callbackpoint * chuangru =new callbackpoint;
			chuangru->point1=(DWORD)thread_d;
			chuangru->point2=(DWORD)myserverpoint;
			chuangru->point3=(DWORD)this_server_info->SOCKETv;
			chuangru->point4=(DWORD)this_server_info;
			if( ((revdatastrct*)thread_d)->datafenlei>=线程处理)//大于500为线程处理
			{
				CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE)recvcallback, chuangru, 0, NULL);

			}
			else  //小于0x500为直接处理,耗时处理开启线程
			{
 
		        ((threadcallback)((DWORD*)recvcallback))(chuangru);
		   
			}

                           LinkNode<send_recv_reset>*pfind;
			   LinkNode<sendwaithandle>*waitfind;
			   for(int i=0;i<mysend_recv_reset->GetLength();i++)//
				{


					pfind=mysend_recv_reset->GetNode(i);
					//if(pfind==NULL)break;
					if(pfind->_data.recv_daima==recdaima)
					{
					//wodexyx.mysend_recv_reset->GetNode(i)->_data.send_daima;
					
						for(int j=0;j<mysendwaithandle->GetLength();j++)
						{
							waitfind=mysendwaithandle->GetNode(j);
							if(waitfind->_data.send_daima==pfind->_data.send_daima)//&&waitfind->_data.fuhetianjian(strbuf))
							{
								waitfind->_data.usend_wait();

							}

						}
						 

					}

				}

		   }
				
		  if(allyichuli>0&&(thisretcount-allyichuli)>0&&(thisretcount-allyichuli)<12&&recvpy==0&&ret>0)
		  {
			   recvpy=thisretcount-allyichuli;
			   memcpy(&this_server_info->user_server_recv->RecvData,(void*)((DWORD)&this_server_info->user_server_recv->RecvData+allyichuli),thisretcount-allyichuli);
		  }
		  else  if((thisretcount)<12&&ret>0)
		  {
        	  recvpy=thisretcount;
		  }



	  }

     RSULock(RecvSp);
     return ret;

 }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值