#包含?& 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?* icmp create file)(void);
typedef?布爾?(__stdcall?*IcmpCloseHandle)(句柄);
icmpcreatefileficimpcreatefile;
IcmpSendEchofIcmpSendEcho
IcmpCloseHandle?fIcmpCloseHandle
布爾?init fun(void)
{
HMODULE?lModl
lmo dl =(HMODULE)LoadLibrary?(“iphlapi . dll“);
如果?(lModl==0)?{
printf(“Load?那個?圖書館?有嗎?錯誤!\ n ");
回歸?假的;
}
否則{
fIcmpCreateFile =(IcmpCreateFile)GetProcAddress?(lModl,“icmp create file“);
fIcmpSendEcho =(IcmpSendEcho)GetProcAddress?(lModl,“IcmpSendEcho“);
fIcmpCloseHandle =(IcmpCloseHandle)GetProcAddress?(lModl,“IcmpCloseHandle“);
如果?(fIcmpCreateFile==NULL?||?fIcmpSendEcho==NULL?||?fIcmpCloseHandle = = NULL ){
printf(“Load?那個?功能?有嗎?錯誤!\ n ");
回歸?假的;
}
回歸?真實;
}
}
LPHANDLE?getping handle(void)
{
手柄?pHandle
pHandle = fIcmpCreateFile();
如果?((int)pHandle = =-1 ){
printf(“Load?ICMP?手柄?有嗎?錯誤!\ n ");
回歸?0;
}
否則{
回歸?(LPHANDLE)pHandle;
}
}
布爾?ping(LPSTR?pIPAddr)
{
手柄?iHwnd
iHwnd =(HANDLE)getping HANDLE();
IPAddr?pAddr
pAddr =(IP addr)inet _ addr?((夏爾?*)pip addr);
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。往返時間,(int)pData。options . Ttl);
}
其他
{
printf(“Ping測試失敗...\ n“);
}
}
如果?(!fIcmpCloseHandle(iHwnd))?printf(“Close?手柄?有嗎?錯誤!\ n ");
回歸?真實;
}
至於主函數,您可以自己編寫,只需向Ping函數傳入壹個IP地址即可運行它。
對應的VB模塊代碼。
私人?申報?功能?IcmpCreateFile?Lib?“iphlpapi.dll”?()?作為什麽?長的
私人?申報?功能?IcmpSendEcho?Lib?“iphlpapi.dll”?(比亞迪爾?IcmpHandle?作為什麽?龍?比亞迪爾。目的地地址?作為什麽?龍?比亞迪爾。RequestData?作為什麽?字符串,?比亞迪爾。RequestSize?作為什麽?龍?比亞迪爾。請求選項?作為什麽?龍?回復緩沖區?作為什麽?ICMP_ECHO_REPLY,比亞迪爾。回復?作為什麽?龍?比亞迪爾。超時?作為什麽?長)?作為什麽?長的
私人?申報?功能?IcmpCloseHandle?Lib?“iphlpapi.dll”?(比亞迪爾?IcmpHandle?作為什麽?長)?作為什麽?長的
私人?申報?功能?inet_addr?Lib?“wsock32.dll“?(比亞迪爾?cp?作為什麽?字符串)?作為什麽?長的
私人?類型?IP _選項_信息
ttl?作為什麽?字節‘‘生存時間
托薩斯?字節??服務類型
旗幟?作為什麽?字節“”IP標頭標誌
OptionsSizeAs?字節??選項數據的大小,字節
OptionsData?作為什麽?長嗎?選項數據指針
結束?類型
私人?類型?ICMP_ECHO_REPLY
地址?長‘‘‘‘‘‘‘包含正在回復的IP地址。
狀態a?long‘‘包含回復的狀態(請參見後面的常量部分)。
往返測量?長嗎??RTT往返時間(毫秒)
DataSizeAs?整數?回復數據大小(字節)
預訂了嗎?整數?保持
ptrDataAs?長嗎??回復數據指針
選項a?IP _選項_信息?回復選項
數據即服務?字符串?*?250
結束?類型
公共的?類型?Rtn _ ICMPTestMessage
地址?作為什麽?線
狀態?作為什麽?字符串?‘‘是用函數編寫的。
測試成功嗎?作為什麽?布爾型?‘‘測試成功?
時間?作為什麽?長的
尺寸?作為什麽?長的
ttl?作為什麽?長的
結束?類型
公共的?功能?RtnICMPTestMessage(ByVal?TestIP?作為什麽?字符串,?比亞迪爾。超時?作為什麽?龍?比亞迪爾。打包?作為什麽?長)?作為什麽?Rtn _ ICMPTestMessage
暗淡?IcmpHandle?作為什麽?長的
IcmpHandle?=?icmp create file‘‘‘創建測試句柄。
暗淡?ICMPReply?作為什麽?ICMP_ECHO_REPLY
暗淡?LongIPAdde?作為什麽?長的
LongIPAddr?=?inet _ addr(TestIP)
暗淡?發送數據?作為什麽?為包大小設置了字符串“”。
發送數據?=?空間(包裝尺寸)
IcmpSendEcho?IcmpHandle,?LongIPAddr?發送數據,?len(SendData),?0,?ICMPReply,?len(ICMPReply)?超時
如果?ICMPReply。地位?=?0?然後
RtnICMPTestMessage。地址?=?TestIP
RtnICMPTestMessage.size?=?ICMPReply。數據大小
RtnICMPTestMessage。狀態?=?RtnICMPState(ICMPReply。狀態)
RtnICMPTestMessage.time?=?ICMPReply。往返時間
RtnICMPTestMessage.ttl?=?ICMPReply。Options.ttl
RtnICMPTestMessage.testSuccess?=?true‘‘‘測試成功。
其他
RtnICMPTestMessage。地址?=?TestIP
RtnICMPTestMessage。狀態?=?RtnICMPState(ICMPReply。狀態)
RtnICMPTestMessage.testSuccess?=?假‘‘‘測試失敗。
結束?如果
IcmpCloseHandle?IcmpHandle
結束?功能