#包含?& ltstdio.h & gt
#包含?& ltwindows.h & gt?
#包含?& ltwininet.h & gt
#pragma?評論(lib,?" ws2_32.lib ")
#pragma?評論(lib,?" wininet.lib ")
typedef?DWORD(__stdcall?*IcmpSendEcho)(HANDLE,IPAddr,LPVOID,WORD,PIP_OPTION_INFORMATION,LPVOID,DWORD,DWORD);
typedef?手柄?(__stdcall?* IcmpCreateFile)(void);
typedef?布爾?(__stdcall?*IcmpCloseHandle)(句柄);
icmpcreatefileficimpcreatefile;
icmpsendechoficimpsendecho;
IcmpCloseHandle?fIcmpCloseHandle
布爾?InitFun(void)
{
HMODULE?lModl
lModl=(HMODULE)LoadLibrary?(“iphlpapi . dll”);
如果?(lModl==0)?{
printf("Load?那個?圖書館?有嗎?錯誤!\ n ");
回歸?假的;
}
否則{
fIcmpCreateFile =(IcmpCreateFile)GetProcAddress?(lModl," IcmpCreateFile ");
fIcmpSendEcho =(IcmpSendEcho)GetProcAddress?(lModl," IcmpSendEcho ");
fIcmpCloseHandle =(IcmpCloseHandle)GetProcAddress?(lModl," IcmpCloseHandle ");
如果?(fIcmpCreateFile==NULL?||?fIcmpSendEcho==NULL?||?fIcmpCloseHandle==NULL){
printf("Load?那個?功能?有嗎?錯誤!\ n ");
回歸?假的;
}
回歸?真實;
}
}
LPHANDLE?GetPingHandle(void)
{
手柄?pHandle
pHandle = fIcmpCreateFile();
如果?((int)pHandle==-1){
printf("Load?ICMP?手柄?有嗎?錯誤!\ n ");
回歸?0;
}
否則{
回歸?(LP handle)pHandle;
}
}
布爾?Ping(LPSTR?pIPAddr)
{
手柄?iHwnd
iHwnd =(HANDLE)getping HANDLE();
IPAddr?pAddr
pAddr=(IPAddr)inet_addr?((char?*)pIPAddr);
icmp_echo_reply?pData
for(int?I = 1;我& lt= LoopSendi++)
{
fIcmpSendEcho(iHwnd,pAddr,NULL,0,NULL,(LPVOID)amp;pData,sizeof(icmp_echo_reply),0);
如果?(pData。狀態==0)
{
printf(" ping測試返回的結果:?時間=%dms?TTL=%d?\n ",(int)pData。RoundTripTime,(int)pData。options . Ttl);
}
其他
{
Printf("Ping測試失敗...\ n ");
}
}
如果?(!fIcmpCloseHandle(iHwnd))?printf("Close?手柄?有嗎?錯誤!\ n ");
回歸?真實;
}
至於主函數,可以自己寫,只要傳壹個IP地址給Ping函數就可以運行了。
對應的VB模塊代碼。
私人?申報?功能?IcmpCreateFile?Lib?“iphlpapi.dll”?()?作為?長的
私人?申報?功能?IcmpSendEcho?Lib?“iphlpapi.dll”?(ByVal?IcmpHandle?作為?龍,?ByVal?目的地地址?作為?龍,?ByVal?RequestData?作為?弦,?ByVal?RequestSize?作為?龍,?ByVal?請求選項?作為?龍,?ReplyBuffer?作為?ICMP_ECHO_REPLY,?ByVal?回復?作為?龍,?ByVal?超時?作為?龍)?作為?長的
私人?申報?功能?IcmpCloseHandle?Lib?“iphlpapi.dll”?(ByVal?IcmpHandle?作為?龍)?作為?長的
私人?申報?功能?inet_addr?Lib?" wsock32.dll "?(ByVal?cp?作為?字符串)?作為?長的
私人?類型?IP _選項_信息
ttl?作為?字節''生存時間
托薩斯?字節??服務類型
旗幟?作為?字節“”IP標頭標誌
OptionsSizeAs?字節??選項數據的大小,字節
OptionsData?作為?很久嗎?指向選項數據的指針
結束?類型
私人?類型?ICMP _ ECHO _回復
AddressAs?長''''包含正在回復的IP地址。
狀態a?Long ' '包含回復的狀態(參見後面的常量部分)。
往返測量?龍??往返時間RTT(毫秒)
DataSizeAs?整數?回復數據大小(字節)
預訂了嗎?整數?保持
ptrDataAs?龍??指向回復數據的指針
選項a?IP_OPTION_INFORMATION?回復選項
數據即服務?字符串?*?250
結束?類型
公共?類型?Rtn _ ICMPTestMessage
地址?作為?線
狀態?作為?字符串?“”是用函數編寫的。
testSuccess?作為?布爾?''測試成功?
時間?作為?長的
尺寸?作為?長的
ttl?作為?長的
結束?類型
公共?功能?RtnICMPTestMessage(ByVal?TestIP?作為?弦,?ByVal?超時?作為?龍,?ByVal?打包?作為?龍)?作為?Rtn _ ICMPTestMessage
暗淡?IcmpHandle?作為?長的
IcmpHandle?=?IcmpCreateFile ' ' '創建測試句柄。
暗淡?ICMPReply?作為?ICMP _ ECHO _回復
暗淡?LongIPAdde?作為?長的
LongIPAddr?=?inet_addr
暗淡?發送數據?作為?為包裝尺寸設置了字符串' ' ' '。
發送數據?=?空間(包裝尺寸)
IcmpSendEcho?IcmpHandle,?LongIPAddr,?SendData,?Len(SendData),?0,?ICMPReply,?len(ICM reply),?超時
如果?ICMPReply。地位?=?0?然後
RtnICMPTestMessage。地址?=?TestIP
RtnICMPTestMessage.size?=?ICMPReply。數據大小
RtnICMPTestMessage。狀態?=?RtnICMPState(ICM reply。狀態)
RtnICMPTestMessage.time?=?ICMPReply。往返時間
RtnICMPTestMessage.ttl?=?ICMPReply。Options.ttl
RtnICMPTestMessage.testSuccess?=?True ' ' '測試成功。
其他
RtnICMPTestMessage。地址?=?TestIP
RtnICMPTestMessage。狀態?=?RtnICMPState(ICM reply。狀態)
RtnICMPTestMessage.testSuccess?=?False ' ' '測試失敗。
結束?如果
IcmpCloseHandle?IcmpHandle
結束?功能