发信人: danielwu(Daniel) 
整理人: teleme(2001-07-29 19:38:48), 站内信件
 | 
 
 
                       作者  小嘉
 
     首先感谢Fire Engine兄在小嘉陷入困境,倍感前途迷茫,有可能遭公司裁员毒手,从而露宿街头、饿死他乡的绝境下向小嘉伸出友爱之手,指点迷津,得张泰立兄大作(http://uh1.gz.163.comjavascript:window.close()" id="102886)一鉴,而在生死关头,小嘉起死回生,胜利完成任务(且颇得技术主管赞许),……唉,短短的一星期内,小嘉历经人生浮沉,幸得各位兄弟相助,才免以饿殍。现在的我,怎么说呢?正步入人生新风景,前程锦绣,人生的的道路真是越走越宽啊,呵呵……二十年前潘晓问:为什么人生的道路越走越窄?二十年后小嘉答曰:那是因为你兄弟太少!程序写毕,不敢独享,将源代码公开,供各位兄弟探讨。    
     再次感谢以Fire Engine为首的各位兄弟:谢谢了!
 
 /*If the program works right, then it's written by Daniel Wu, otherwise I don't know whose work 
 
 it is.*/
 //---------------------------------------------------------------------------
 
 #include <StdCtrls.hpp>
 #include <winsock2.h>
 #include <mem.h>
 
 //---------------------------------------------------------------------------
 
 ////////////////////////////////////////////////////////////////////////////////////
 /////定义结构tagIPOptionInformation、tagIcmpEchoReply及其相应类型以保证ICMP协议的实现:
   typedef struct tagIPOptionInformation{
     byte TTL,TOS,Flags,OptionsSize;
     PChar OptionsData;
   }TIPOptionInformation,*pTIPOptionInformation;
   typedef struct tagIcmpEchoReply{
     DWORD Address,Status,RTT;
     WORD DataSize,Reserved;
     void *Data;
     TIPOptionInformation Options;
   }TIcmpEchoReply,*pTIcmpEchoReply;
 ////////////////////////////////////////////////////////////////////////////////////
 /////定义指向函数的指针类型pIcmpCreateFile、pIcmpSendEcho、pIcmpCloseHandle以调用动态连接库ICMP
 
 中相应的函数:
   typedef HANDLE (*pIcmpCreateFile)();
   typedef DWORD (*pIcmpSendEcho)(HANDLE IcmpHandle,DWORD DestinationAddress,LPVOID 
 
 RequestData,WORD RequestSize,pTIPOptionInformation RequestOptions,LPVOID ReplyBuffer,DWORD 
 
 ReplySize,DWORD Timeout);
   typedef BOOL (*pIcmpCloseHandle)(HANDLE IcmpHandle);
 
 //---------------------------------------------------------------------------
 
 ////////////////////////////////////////////////////////////////////////////////////
 /////类TWindowPing的头,该类通过调用动态连接库ICMP中的函数
 
 IcmpCreateFile、IcmpSendEcho、IcmpCloseHandle来实现PING操作:
 class TWindowPing
 {
 private:
   bool PingPass;
   HINSTANCE dllModule;
   LPWSADATA pWSAData;
   HANDLE TheHandle;
   DWORD FSize,BufferSize,ReqBufSize,IPAddress,FTimeOut;
   PChar pReqData,pRevData;
   AnsiString SendPackage,ErrorMessage;
   pTIcmpEchoReply pIPE;
   pTIPOptionInformation IPOpt;
   pIcmpCreateFile FunIcmpCreateFile;
   pIcmpSendEcho FunIcmpSendEcho;
   pIcmpCloseHandle FunIcmpCloseHandle;
 public:
   DWORD IP,TimeOut;
   AnsiString MessagePackage,Error;
   TWindowPing(AnsiString ParamIPAddress="127.0.0.1",AnsiString 
 
 ParamSendPackage="WindowPing",DWORD ParamTimeOut=5000);
   bool Ping();
   ~TWindowPing();  
 };
 
 //---------------------------------------------------------------------------
 /*类TWindowPing的实现*/
 //---------------------------------------------------------------------------
 
 #include "TWindowPing.h"
 
 //---------------------------------------------------------------------------
 
 ////////////////////////////////////////////////////////////////////////////////////
 /////类TWindowPing构造函数定义:
 TWindowPing::TWindowPing(AnsiString ParamIPAddress,AnsiString ParamSendPackage,DWORD 
 
 ParamTimeOut)//ParamIPAddress:IP地址;ParamSendPackage向目标计算机发送的数据包;ParamTimeOut:
 
 连接超时限制
 {
   IPAddress=inet_addr(ParamIPAddress.c_str());
   IP=IPAddress;
 ////////////////////////////////////////////////////////////////////////////////////
 /////WinSock2初始化:
   pWSAData=new WSADATA;
   pWSAData->wVersion=2;
   pWSAData->wHighVersion=2;
   WSAStartup(2,pWSAData);
 ////////////////////////////////////////////////////////////////////////////////////
 /////dll初始化:
   dllModule=LoadLibrary("Icmp.dll");//导入动态连接库
   FunIcmpCreateFile=(pIcmpCreateFile)GetProcAddress(dllModule,"IcmpCreateFile");
   FunIcmpSendEcho=(pIcmpSendEcho)GetProcAddress(dllModule,"IcmpSendEcho");
   FunIcmpCloseHandle=(pIcmpCloseHandle)GetProcAddress(dllModule,"IcmpCloseHandle");
 ////////////////////////////////////////////////////////////////////////////////////
 /////FunIcmpSendEcho各项参数初始化:
   FSize=40;
   BufferSize=sizeof(TIcmpEchoReply)+FSize;
   pRevData=new char[40];
   setmem(pRevData,sizeof(pRevData),0);
   pIPE=new TIcmpEchoReply;
   setmem(pIPE,sizeof(pIPE),0);
   pIPE->Data=pRevData;
   pIPE->Options.OptionsData=pRevData;
   SendPackage=ParamSendPackage;
   MessagePackage=SendPackage;
   pReqData=SendPackage.c_str();
   IPOpt=new TIPOptionInformation;
   setmem(IPOpt,sizeof(IPOpt),0);
   IPOpt->TTL=64;
   FTimeOut=ParamTimeOut;
   TimeOut=FTimeOut;
   ReqBufSize=SendPackage.Length();
 }; 
 
 //---------------------------------------------------------------------------
 
 ////////////////////////////////////////////////////////////////////////////////////
 /////PING操作的实现(类TWindowPing成员函数):
 bool TWindowPing::Ping()//返回值为true,说明PING到
 {
   TheHandle=FunIcmpCreateFile();//打开ICMP协议入口句柄
   if(TheHandle!=INVALID_HANDLE_VALUE)
   {
     
 
 FunIcmpSendEcho(TheHandle,IPAddress,pReqData,ReqBufSize,IPOpt,pIPE,BufferSize,FTimeOut);//PING
 
 目标计算机
     if(pIPE->Status==0)
     {
       PingPass=true;
       ErrorMessage="Pass";
       Error=ErrorMessage;
     }
     else
     {
       PingPass=false;
       ErrorMessage="Offline";
       Error=ErrorMessage;
     }
   }
   else
   {
     PingPass=false;
     ErrorMessage="Ping failed";
     Error=ErrorMessage;
   }
   return PingPass;
 }
 
 //---------------------------------------------------------------------------
 
 ////////////////////////////////////////////////////////////////////////////////////
 /////类TWindowPing的析构定义:
 TWindowPing::~TWindowPing()
 {
   delete IPOpt;
   delete pIPE;
   delete []pRevData;
   FunIcmpCloseHandle(TheHandle);//关闭ICMP协议入口句柄
   FreeLibrary(dllModule);//释放动态连接库句柄
   delete pWSAData;
 };
 
 //---------------------------------------------------------------------------
 
 
  
 
  
  
 
 
  ----                                            <img src="http://uh1.gz.163.com photo?name=danielwu">
       | 
 
 
 |