IcmpSendEcho是用于ICMP( [ Internet Control Message Protocol ]Internet例如Ping就是一个很好的例子.。
基本介绍
- 外文名IcmpSendEcho
- 定义控制报文协定)测试,
- 作用直观地测试本地计算机网路速度,
- ‘生存时间ttl As Byte '
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");
}