精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● Delphi>>Delphi 网络编程>>Ping(C++代码)

主题:Ping(C++代码)
发信人: 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">
     

[关闭][返回]