WORD YourClass::GetUDPChecksum( unsigned char* pucIPPktBuffer )
{
	WORD           wUDPPktLength;
	WORD           wUDPProtocol;
	WORD           wData;
	unsigned long  ulSum;
	unsigned char* pchUDPBuffer;
	BOOL           bMemClear;
	
	int            i;

	/* set udp protocol number */
	wUDPProtocol = 17;
	ulSum        = 0;
	
	/* get UDP packet length */
	wUDPPktLength = MAKEWORD( pucIPPktBuffer[25], pucIPPktBuffer[24] ); // low, high
	
	/* set UDP checksum fiels to zero */
	pucIPPktBuffer[26] = 0x00;
	pucIPPktBuffer[27] = 0x00;

	/* padding */
	if( (wUDPPktLength % 2) != 0  )
	{
		// odd length
		pchUDPBuffer = new unsigned char[wUDPPktLength+1];
		ZeroMemory(pchUDPBuffer, wUDPPktLength+1);
		memcpy(pchUDPBuffer, pucIPPktBuffer+20, wUDPPktLength); //skip udp header
		bMemClear = TRUE;
	}
	else
	{
		pchUDPBuffer = pucIPPktBuffer+20;
		bMemClear = FALSE;
	}
	
	/* udp packet */
	for( i = 0; i < wUDPPktLength; i = i+2 )
	{
		wData =	MAKEWORD(pchUDPBuffer[i+1], pchUDPBuffer[i]); //ip header 20 byte
		ulSum = ulSum + (unsigned long)wData;
	}

	/*
	*  compute psuedo header
	*/

	/* source and destnation address */
	wData = MAKEWORD(pucIPPktBuffer[13], pucIPPktBuffer[12]);
	ulSum = ulSum + (unsigned long)wData;
	wData = MAKEWORD(pucIPPktBuffer[15], pucIPPktBuffer[14]);
	ulSum = ulSum + (unsigned long)wData;
	wData = MAKEWORD(pucIPPktBuffer[17], pucIPPktBuffer[16]);
	ulSum = ulSum + (unsigned long)wData;
	wData = MAKEWORD(pucIPPktBuffer[19], pucIPPktBuffer[18]);
	ulSum = ulSum + (unsigned long)wData;

	/* */
	ulSum = ulSum + (unsigned long)wUDPProtocol + wUDPPktLength;

	/* */
	ulSum = (ulSum >> 16) + (ulSum & 0xFFFF);
	ulSum = ulSum + (ulSum >> 16);

	if( TRUE == bMemClear )
	{
		delete [] pchUDPBuffer;
	}

	return ((WORD)~ulSum);
}
