이렇게 사용 안하려면, 패킷을 받기전에 패킷의 길이 부터 파악할 수 있어야 하는데, afxsock.h에서는 패킷의 길이를 파악할 수 있는 함수(IOCtl)를 제공한다. 실제 사용은 아래와 같이 하면된다.
[-] Collapse
void CClientSocket::OnReceive(int nErrorCode)
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
//Receive를 분할 수신하면... 랜덤하게 100000번 내외에서 못받음 현상발생
DWORD dwReadLen;
IOCtl(FIONREAD, &dwReadLen); //패킷 길이를 먼저 파악하고
char* szReceBuff = new char[dwReadLen];
int nReadLen = 0;
nReadLen = Receive( szReceBuff, dwReadLen ); //한번에 다받아야 한다..
int header[2];
memcpy(header,szReceBuff,sizeof(int)*2); //한번에 받고나서 헤더를 분리하고
if(header[0]==Command::Grab) //헤더의 내용(id,길이)에 따라..
{
memcpy(&GrabInfo,&szReceBuff[2*sizeof(int)/sizeof(char)],header[1]);
//받은후 작업 추가.
}
delete szReceBuff;
CAsyncSocket::OnReceive(nErrorCode);
}
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
//Receive를 분할 수신하면... 랜덤하게 100000번 내외에서 못받음 현상발생
DWORD dwReadLen;
IOCtl(FIONREAD, &dwReadLen); //패킷 길이를 먼저 파악하고
char* szReceBuff = new char[dwReadLen];
int nReadLen = 0;
nReadLen = Receive( szReceBuff, dwReadLen ); //한번에 다받아야 한다..
int header[2];
memcpy(header,szReceBuff,sizeof(int)*2); //한번에 받고나서 헤더를 분리하고
if(header[0]==Command::Grab) //헤더의 내용(id,길이)에 따라..
{
memcpy(&GrabInfo,&szReceBuff[2*sizeof(int)/sizeof(char)],header[1]);
//받은후 작업 추가.
}
delete szReceBuff;
CAsyncSocket::OnReceive(nErrorCode);
}