IcmpSendEcho

生活百科 2023-01-17 20:00生活百科www.aizhengw.cn

IcmpSendEcho

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");
}

Copyright@2015-2025 www.aizhengw.cn 癌症网版板所有