www.gusucode.com > 一些VC++加密算法+实例源码源码程序 > 一些VC++加密算法+实例源码/优化后的加密注册模块/优化后的加密注册模块/inventory(optimized)/UCICMP.cpp

    // UCICMP.cpp: implementation of the UCICMP class.


#include "stdafx.h"
#include "UCICMP.h"
#include "timeb.h"

UCICMP gcICMP;

//**************************************************************************
UCICMP::UCICMP()
{
	miID = 0x4545;
	miSeq = 1;
}

UCICMP::~UCICMP()
{

}


//************************************************************************
bool UCICMP::mfInit()
{
	SOCKADDR_IN lcAddr;
	WSADATA lcData;

	WSAStartup(0x0002,&lcData);

	memset(&lcAddr,0,sizeof(lcAddr));
	lcAddr.sin_family = AF_INET;

	msSocket = socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);
	if (msSocket == INVALID_SOCKET)
		return false;
	int liret = bind(msSocket,(sockaddr*)&lcAddr,sizeof(lcAddr));
	if (liret == SOCKET_ERROR)
	{
		closesocket(msSocket);
		return false;
	}
	return true;
}


//******************************************************************************
bool UCICMP::mfUninit()
{
	closesocket(msSocket);
	::WSACleanup();
	return true;
}


//*******************************************************************************
bool UCICMP::mfPing(char *IPaddr, int aiTimeOut)
{
	char lcBuffer[256];
	ICMPHeader *lpIcmpHeader,lcIcmpHeader;
	IPHeader lcIPHeader;
	SOCKADDR_IN	lcAddr;
	int liPad,liLen,liret;
	_timeb lctime;
	_timeb lcCurtime;

	in_addr asIP;
	asIP.S_un .S_addr =inet_addr(IPaddr);
	if(asIP.S_un.S_addr==INADDR_NONE) 
		return false;	

	lpIcmpHeader = (ICMPHeader *)lcBuffer;
	memset(lcBuffer,64,64);

	lpIcmpHeader->i_code = 0;
	lpIcmpHeader->i_type = ICMP_ECHO;
	lpIcmpHeader->i_flex.i_short[0]=miID;
	lpIcmpHeader->i_flex.i_short[1]=miSeq++;
	lpIcmpHeader->i_cksum = 0;
	lpIcmpHeader->i_cksum = mfCheckNum((char*)lpIcmpHeader,64);

	memset(&lcAddr,0,sizeof(SOCKADDR_IN));
	lcAddr.sin_family = AF_INET;
	lcAddr.sin_addr.S_un .S_addr = asIP.S_un .S_addr ;
	
	liLen = sizeof(sockaddr);

	liret = setsockopt(msSocket,SOL_SOCKET,SO_RCVTIMEO,(char*)&aiTimeOut,
  						sizeof(aiTimeOut));
 
	liret = sendto(msSocket,lcBuffer,64,0,(sockaddr*)&lcAddr,sizeof(sockaddr));
	_ftime(&lctime);
	lcCurtime = lctime;

	if (liret != 64)
		return false;


	while (((lcCurtime.time - lctime.time)*1000 + (lcCurtime.millitm-lctime.millitm)<aiTimeOut)&&
		(liret = recvfrom(msSocket,lcBuffer,256,0,(sockaddr*)&lcAddr,&liLen))
		!= SOCKET_ERROR)
	{
		_ftime(&lcCurtime);

		if (!mfUnpack(lcBuffer,liret,&lcIPHeader,&lcIcmpHeader,liPad))
			continue;
		if (lcIcmpHeader.i_type != ICMP_ECHOREPLY
			|| lcIcmpHeader.i_code != 0 )
			continue;
		if (lcIcmpHeader.i_flex.i_short[0] != miID 
			|| lcIcmpHeader.i_flex .i_short [1] != (miSeq -1))
			continue;
		return true;
	};
	
	return false;

}


//*******************************************************************************
USHORT UCICMP::mfCheckNum(char *acBuf, int aiSize)
{
  unsigned long cksum=0;
  USHORT * buffer;

  buffer = (USHORT*) acBuf;

  while(aiSize >1) {
	cksum+=*buffer++;
	aiSize -=sizeof(USHORT);
  }
  
  if(aiSize ) {
	cksum += *(UCHAR*)buffer;
  }

  cksum = (cksum >> 16) + (cksum & 0xffff);
  cksum += (cksum >>16);
  return (USHORT)(~cksum);
}


//*********************************************************************************
bool UCICMP::mfUnpack(char *acBuf, int liSize, IPHeader *acIPHeader,
					  ICMPHeader *acIcmpHeader,int &aiPad)
{
	int liICMPPointer;

	memcpy(acIPHeader,acBuf,sizeof(IPHeader));
	acIPHeader->mfntoh ();
	liICMPPointer = acIPHeader->h_len *4 ;
	if (mfCheckNum (acBuf,liICMPPointer)!=0)
		return false;
	if (acIPHeader->proto != IPPROTO_ICMP)
		return false;
	memcpy(acIcmpHeader,acBuf+liICMPPointer,sizeof(ICMPHeader));
	if (mfCheckNum(acBuf+liICMPPointer,acIPHeader->total_len - liICMPPointer)
		!= 0 )
		return false;
	aiPad = liICMPPointer + sizeof(ICMPHeader);

	return true;
}


//*********************************************************************************
bool UCICMP::IPHeader::mfntoh()
{
	total_len = ntohs(total_len);
	ident = ntohs(ident);
	frag_and_flags = ntohs(frag_and_flags);

	return true;
}


//*********************************************************************************
bool UCICMP::IPHeader::mfhton()
{
	total_len = htons(total_len);
	ident = htons(ident);
	frag_and_flags = htons(frag_and_flags);
	
	return true;
}