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