Programming - cpueblo.com

논블록킹 소켓 통신시 최강의 Header + Data 구분 코드!!! 짱짱!


글쓴이 : 유광희 날짜 : 2002-07-30 (화) 20:25 조회 : 16041
// 아주 짱이다. 용량 제한 없이 엄청난 데이타를 논블록킹으로 받을 수 있다. ^_^
// 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;
}