IcmpSendEcho是用於ICMP( [ Internet Control Message Protocol ]Internet例如Ping就是一個很好的例子.。
基本介紹
IcmpSendEcho,函式原型,C/C++:,VB:,參數意義:,需要用到的數據類型:,如何判斷測試成功?,一段C++控制台示例代碼:,
IcmpSendEcho
用於ICMP( [ Internet Control Message Protocol ]Internet例如Ping就是一個很好的例子.
函式原型
C/C++:
DWORD WINAPI IcmpSendEcho(
HANDLE IcmpHandle,
IPAddr DestinationAddress,
LPVOID RequestData,
WORD RequestSize,
PIP_OPTION_INFORMATION RequestOptions,
LPVOID ReplyBuffer,
DWORD ReplySize,
DWORD Timeout);
VB:
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
參數意義:
IcmpHandle
[in] 傳入由IcmpCreateFile創建的一個測試句柄
DestinationAddress
[in] 要測試的IP位址,(需要用到inet_addr() 函式來轉換)
RequestData
[in] 需要傳送到IP位址的數據,傳入指針
RequestSize
[in] 傳送的數據大小
RequestOptions
[in] IP頭選項,傳入指針
ReplyBuffer
[out] 測試後返回的數據,用icmp_echo_reply來接收
ReplySize
[out] ReplyBuffer的大小,一般是 sizeof(icmp_echo_reply)+sizeof(RequestData) ,VB的話用 Len(ReplyBuffer)+Len(RequestData)
Timeout
[in] 一個以MS為單位的值,代表著一個逾時值
需要用到的數據類型:
C++ ip_option_information :
typedef struct ip_option_information {
UCHAR Ttl;
UCHAR Tos;
UCHAR Flags;
UCHAR OptionsSize;
PUCHAR OptionsData;
} IP_OPTION_INFORMATION, *PIP_OPTION_INFORMATION;
VB ip_option_information :
Type IP_OPTION_INFORMATION
Tos As Byte ' ‘服務類型
Flags As Byte ' ‘IP頭標誌
OptionsSize As Byte ' ‘選項數據的大小,位元組
OptionsData As Long ' ‘指向選項數據的指針
End Type
C++ icmp_echo_reply:
typedef struct icmp_echo_reply {
IPAddr Address;
ULONG Status;
ULONG RoundTripTime;
USHORT DataSize;
USHORT Reserved;
PVOID Data;
struct ip_option_information Options;
} ICMP_ECHO_REPLY, *PICMP_ECHO_REPLY;
VB icmp_echo_reply:
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
如何判斷測試成功?
你可能會發現,用IcmpSendEcho 測試 127.0.0.1的時候,ICMP_ECHO_REPLY.RoundTripTime 會等於0
其實,這個函式是沒有出錯的,即使用Ping 127.0.0.1也是可以的
那么應該怎么去判斷這個函式出錯呢?
用 ICMP_ECHO_REPLY.Status 來獲得測試狀態(記住,當Status為0的時候,函式是正確運行的)
常量名 | 值 | 含義 |
---|---|---|
IP_SUCCESS | 0 | 狀態是成功。 |
IP_BUF_TOO_SMALL | 11001 | 答覆緩衝區太小。 |
IP_DEST_NET_UNREACHABLE | 11002 | 目標網路不可達。 |
IP_DEST_HOST_UNREACHABLE | 11003 | 目標主機不可達。 |
IP_DEST_PROT_UNREACHABLE | 11004 | 目的地的協定是遙不可及。 |
IP_DEST_PORT_UNREACHABLE | 11005 | 目標連線埠不可達。 |
IP_NO_RESOURCES | 11006 | IP資源不足是可用的。 |
IP_BAD_OPTION | 11007 | 指定了錯誤的IP選項。 |
IP_HW_ERROR | 11008 | 一個硬體錯誤。 |
IP_PACKET_TOO_BIG | 11009 | 包太大。 |
IP_REQ_TIMED_OUT | 11010 | 請求逾時。 |
IP_BAD_REQ | 11011 | 一個壞的請求。 |
IP_BAD_ROUTE | 11012 | 一個糟糕的路線。 |
IP_TTL_EXPIRED_TRANSIT | 11013 | 在傳輸過程中的生存時間(TTL)的過期。 |
IP_TTL_EXPIRED_REASSEM | 11014 | 在碎片重組過程中的生存時間過期。 |
IP_PARAM_PROBLEM | 11015 | 一個參數的問題。 |
IP_SOURCE_QUENCH | 11016 | 數據報到達太快,處理和數據報可能被丟棄。 |
IP_OPTION_TOO_BIG | 11017 | 一個IP選項是太大了。 |
IP_BAD_DESTINATION | 11018 | 一個壞的目的地。 |
IP_GENERAL_FAILURE | 11050 | 一般故障。這個錯誤可以返回一些畸形的ICMP數據包 |
一段C++控制台示例代碼:
void Ping(char *pIPAddr)
{
HANDLE iHwnd;
iHwnd=IcmpCreateFile();
IPAddr pAddr;
pAddr=(IPAddr)inet_addr (pIPAddr);
icmp_echo_reply pData;
for(int i=1;i<=LoopSend;i++)
{
IcmpSendEcho(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 (!IcmpCloseHandle(iHwnd)) printf("Close handle has Error!\n");
}