定义了一个函数,如下,接收数据,有什么问题?
bool CPeerSocket::PeerRecvData(SOCKET socket,char *data,DWORD len,DWORD *retlen,WSAEVENT hRecvEvent,DWORD time)
{
WSABUF DataBuf;
WSAEVENT hEvents[2];
WSAOVERLAPPED RecvOverLapp;
DWORD flag; hEvents[0]=hExitEvent;
hEvents[1]=hRecvEvent;
DataBuf.buf=data;
DataBuf.len=len;
memset(&RecvOverLapp,0,sizeof(WSAOVERLAPPED));
RecvOverLapp.hEvent=hRecvEvent;
flag=0;
/////////////////////////////////////
int ret;
if((ret=WSARecv(socket,&DataBuf,1,retlen,&flag,&RecvOverLapp,NULL))==0)
return true;
else if((ret==SOCKET_ERROR)&&(WSAGetLastError()==WSA_IO_PENDING))
{
DWORD EventCaused=WSAWaitForMultipleEvents(2,hEvents,FALSE,time,FALSE);
WSAResetEvent(hRecvEvent);
if(EventCaused == WSA_WAIT_FAILED || EventCaused == WAIT_OBJECT_0)
{
// AfxMessageBox("Peer wait Exit");
return false;
}
flag=0;
return (WSAGetOverlappedResult(socket,&RecvOverLapp,retlen,false,&flag))?
true:false;
}
else
return false;
}

解决方案 »

  1.   

    其实我想接收数据,每个数据包分为数据头和数据,分两次接收,数据部分根据数据包头的长度获取,正常情况下,运行正常,但但数据包头数据读取错后,数据部分就不能正常读取了,我想问问大家都是实现的.
      

  2.   

    你的思路是对的。每个数据包分为数据头和数据,分两次接收,数据部分根据数据包头的长度获取。但是这是有前提的,每次接收的数据都应该是整个包,也就是说每次接受的数据不能有粘包现象,或者数据丢失现象。既然知道了数据部分的长度,就一定要完全的把该数据接收下来,不能丢包,可以用循环进行接受,直到接受的数据长度为正确的数据长度为止。