发信人: 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">
|
|