IcmpSendEcho

IcmpSendEcho是用於ICMP( [ Internet Control Message Protocol ]Internet例如Ping就是一個很好的例子.。

基本介紹

  • 外文名:IcmpSendEcho
  • 定義:控制報文協定)測試,
  • 作用:直觀地測試本地計算機網路速度,
  • ‘生存時間:ttl As Byte ' 
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也是可以的
IcmpSendEcho
那么應該怎么去判斷這個函式出錯呢?
用 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");
}

相關詞條

熱門詞條

聯絡我們