#include?<stdio.h>
#include?<windows.h>?
#include?<wininet.h>
#pragma?comment(lib,?"ws2_32.lib")
#pragma?comment(lib,?"wininet.lib")
typedef?DWORD?(__stdcall?*IcmpSendEcho)(HANDLE,IPAddr,LPVOID,WORD,PIP_OPTION_INFORMATION,LPVOID,DWORD,DWORD);
typedef?HANDLE?(__stdcall?*IcmpCreateFile)(void);
typedef?BOOL(__stdcall?*IcmpCloseHandle)(HANDLE);
IcmpCreateFile?fIcmpCreateFile;
IcmpSendEchofIcmpSendEcho; IcmpCloseHandle?fIcmpCloseHandle;BOOL?InitFun(void)
{
HMODULE?lModl;
lModl=(HMODULE)LoadLibrary?("Iphlpapi.dll");
if?(lModl==0)?{
printf("Load?the?library?has?error!\n");
return?FALSE;
}
else{
fIcmpCreateFile=(IcmpCreateFile)GetProcAddress?(lModl,"IcmpCreateFile");
fIcmpSendEcho=(IcmpSendEcho)GetProcAddress?(lModl,"IcmpSendEcho");
fIcmpCloseHandle=(IcmpCloseHandle)GetProcAddress?(lModl,"IcmpCloseHandle");
if?(fIcmpCreateFile==NULL?||?fIcmpSendEcho==NULL?||?fIcmpCloseHandle==NULL){
printf("Load?the?function?has?error!\n");
return?FALSE;
}
return?TRUE;
}
}
LPHANDLE?GetPingHandle(void)
{
HANDLE?pHandle;
pHandle=fIcmpCreateFile();
if?((int)pHandle==-1){
printf("Load?ICMP?handle?has?error!\n");
return?0;
}
else{
return?(LPHANDLE)pHandle;
}
}
BOOL?Ping(LPSTR?pIPAddr)
{
HANDLE?iHwnd;
iHwnd=(HANDLE)GetPingHandle();
IPAddr?pAddr;
pAddr=(IPAddr)inet_addr?((char?*)pIPAddr);
icmp_echo_reply?pData;
for(int?i=1;i<=LoopSend;i++)
{
fIcmpSendEcho(iHwnd,pAddr,NULL,0,NULL,(LPVOID)&pData,sizeof(icmp_echo_reply),0);
if?(pData.Status==0)
{
printf("Ping測試返回的結果:?Time=%dms?TTL=%d?\n",(int)pData.RoundTripTime,(int)pData.Options.Ttl);
}
else
{
printf("Ping測試失敗...\n");
}
}
if?(!fIcmpCloseHandle(iHwnd))?printf("Close?handle?has?Error!\n");
return?TRUE;
}
至於main函數的話妳可以自己寫,只要傳入壹個IP地址給Ping函數就可以運行了
與它對應的VB模塊代碼
Private?Declare?Function?IcmpCreateFile?Lib?"iphlpapi.dll"?()?As?Long
Private?Declare?Function?IcmpSendEcho?Lib?"iphlpapi.dll"?(ByVal?IcmpHandle?As?Long,?ByVal?DestinationAddress?As?Long,?ByVal?RequestData?As?String,?ByVal?RequestSize?As?Long,?ByVal?RequestOptions?As?Long,?ReplyBuffer?As?ICMP_ECHO_REPLY,?ByVal?ReplySize?As?Long,?ByVal?Timeout?As?Long)?As?Long
Private?Declare?Function?IcmpCloseHandle?Lib?"iphlpapi.dll"?(ByVal?IcmpHandle?As?Long)?As?Long
Private?Declare?Function?inet_addr?Lib?"wsock32.dll"?(ByVal?cp?As?String)?As?Long
Private?Type?IP_OPTION_INFORMATION
ttl?As?Byte'‘生存時間
TosAs?Byte'?‘服務類型
Flags?As?Byte'‘IP頭標誌
OptionsSize?As?Byte?'?‘選項數據的大小,字節
OptionsData?As?Long'?‘指向選項數據的指針
End?Type
Private?Type?ICMP_ECHO_REPLY
Address?As?Long?''‘包含正回復的IP地址
Status?As?Long?'?‘包含回復的狀態(參看後面的常量部分)
RoundTripTime?As?Long?'?‘往返時間RTT(毫秒)
DataSize?As?Integer?'‘回復數據大小(字節)
Reserved?As?Integer'?‘保留
ptrData?As?Long'‘指向回復數據的指針
Options?As?IP_OPTION_INFORMATION?'‘回復選項
Data?As?String?*?250
End?Type
Public?Type?Rtn_ICMPTestMessage
Address?As?String
State?As?String?'''用函數寫
testSuccess?As?Boolean?'''?是否成功測試
time?As?Long
size?As?Long
ttl?As?Long
End?Type
Public?Function?RtnICMPTestMessage(ByVal?TestIP?As?String,?ByVal?Timeout?As?Long,?ByVal?PackSize?As?Long)?As?Rtn_ICMPTestMessage
Dim?IcmpHandle?As?Long
IcmpHandle?=?IcmpCreateFile'''創建測試句柄
Dim?ICMPReply?As?ICMP_ECHO_REPLY
Dim?LongIPAdde?As?Long
LongIPAddr?=?inet_addr(TestIP)
Dim?SendData?As?String'''''?為了包大小而設置
SendData?=?Space(PackSize)
IcmpSendEcho?IcmpHandle,?LongIPAddr,?SendData,?Len(SendData),?0,?ICMPReply,?Len(ICMPReply),?Timeout
If?ICMPReply.Status?=?0?Then
RtnICMPTestMessage.Address?=?TestIP
RtnICMPTestMessage.size?=?ICMPReply.DataSize
RtnICMPTestMessage.State?=?RtnICMPState(ICMPReply.Status)
RtnICMPTestMessage.time?=?ICMPReply.RoundTripTime
RtnICMPTestMessage.ttl?=?ICMPReply.Options.ttl
RtnICMPTestMessage.testSuccess?=?True?'''測試成功
Else
RtnICMPTestMessage.Address?=?TestIP
RtnICMPTestMessage.State?=?RtnICMPState(ICMPReply.Status)
RtnICMPTestMessage.testSuccess?=?False?'''測試失敗
End?If
IcmpCloseHandle?IcmpHandle
End?Function