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; }