// 아주 짱이다. 용량 제한 없이 엄청난 데이타를 논블록킹으로 받을 수 있다. ^_^
// define 3 개만 바꿔주면 어느 곳에서나 다 통하지~~
#define PKT_HEADER_SIZE sizeof(PACKET_BILLCOMM)
#define PKT_HEADER PACKET_BILLCOMM
#define PKT_DATALENGTH htonl(rpkt.PacketLength) - BILLCOMM_SIZE
enum RecvTypes
{
HEADER,
DATA,
};
int RecvType = HEADER;
char *pData = NULL;
char *pDataPos;
DWORD dwDataPos;
PKT_HEADER rpkt;
// 사용자 정의 함수!!
void TBRSPacket :: ShowDebug(String Str)
{
frmBRSMain->ShowClientMessage(Socket, Str);
}
// 사용자 정의 함수!!
void TBRSPacket :: OnDataRead()
{
PACKET_RANK *pktRank;
pktRank = (PACKET_RANK *)pData;
int c;
c = 5;
}
// 아래 ClientRead 를 쓰면 return 0; 을 없애시구.. 알아서 ^^
void __fastcall TSocket::ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
//int TBRSPacket :: Recv()
//{
int RecvLen = Socket->ReceiveLength();
// 이번에 받을 데이타가 헤더로 설정되어 있다면?
if (RecvType == HEADER)
{
if (RecvLen < PKT_HEADER_SIZE)
<FONT COLOR=#0000FF>return 0;
ShowDebug("> Header Reading");
Socket->ReceiveBuf(&rpkt, PKT_HEADER_SIZE);
// 받을 데이타가 예약되어 있다면 데이타를 받기 위해 준비한다
if (PKT_DATALENGTH > 0)
{
pData = new char[PKT_DATALENGTH + 1];
// 데이타 값을 받아들이기 위해 초기화를 한다
dwDataPos = 0;
pDataPos = pData;
RecvType = DATA;
}
else
{
// 헤더만 있는 경우 다 받았다는 함수. ^_^ OnDataRead 에서 rpkt 와 pData 를 가지고 논다.
OnDataRead();
}
return 0;
}
else if (RecvType == DATA)
{
// 마지막 패킷 이라 생각될때?
if (dwDataPos + RecvLen >= PKT_DATALENGTH)
{
// 디버깅 메세지
ShowDebug("> Data Reading. Total Data Length = " + IntToStr(PKT_DATALENGTH));
// 데이타를 받는다
int r = Socket->ReceiveBuf(pDataPos, PKT_DATALENGTH - dwDataPos);
// 마지막에도 요청값과 틀린지를 채크한다. ^_^ 아래 또한 중요!
if (r != PKT_DATALENGTH - dwDataPos)
{
pDataPos += r;
dwDataPos += r;
return 0;
}
// 이 함수는 사용자 정의 함수. ^_^ OnDataRead 에서 rpkt 와 pData 를 가지고 논다.
OnDataRead();
// 다음 헤더를 받기 위해 초기화를 다 해준다
ZeroMemory(&rpkt, PKT_HEADER_SIZE);
RecvType = HEADER;
delete pData;
pData = NULL;
}
// 마지막 패킷이 아니라 생각될때
else
{
// 데이타를 받고, 받은 데니타만 증가한다.
int r = Socket->ReceiveBuf(pDataPos, RecvLen);
pDataPos += r;
dwDataPos += r;
}
return 0;
}
return 0;
}
|