※==================================================================
※本连载文章说明:
※1、连载首发于《软件报》(http://www.sweek.com)2006年21期(2006年5月22日);
※2、此次网上连载采用的是原稿件结构,内容与《软件报》发表略有不同;
※3、谢绝除《软件报》及其相关刊物之外的传统媒体部分或全部转载;
※4、谢绝任何收费媒体、网络转载;
※5、原作者:uruseibest ,blog:http://blog.csdn.net/uruseibest;
※6、如有其它疑问,请联系作者;
※7、如有转载,必须连同本说明一并发表,否则将追究转载者责任。
※======================================================================
第四节 实例二:探测到某个IP地址经过的路由列表
计算机在Internet中传递信息时,并不能直接从某一主机上得到去往另一主机的路径,必须通过路由将信息传到主机。发送ICMP报时,ICMP报头中包含了一个TTL设置,报文每当经过一个路由,TTL值相应的减1。当请求报文在传输过程中超时,即TTL被减为0,则该路由器返回一个目标不可达到报文;否则在TTL未被减少到0时,报文到达目标主机,则目标主机返回回应报文,表示数据可以正常到达。我们可以利用此原理,开始时将TTL设置为1,然后发出ICMP报,获得响应,检验地址是否是目标主机IP地址,是目标主机的话,表示到达目标主机;不是的话,返回的地址就是最后到达的路由器的地址,然后将TTL设置为2,重复以上过程,直至TTL设置为255。
在这个例子中,将使用第二章第十九节所用到的函数、类型及常量(请参看第二章第十九节中的介绍),但对IcmpSendEcho函数声明作一点变化。
Private Declare Function IcmpSendEcho Lib "icmp.dll" ( _
ByVal IcmpHandle As Long, ByVal DestinationAddress As Long, _
ByVal RequestData As String, ByVal RequestSize As Long, _
RequestOptions As IP_OPTION_INFORMATION, ReplyBuffer As ICMP_ECHO_REPLY, _
ByVal ReplySize As Long, ByVal Timeout As Long) As Long
其中RequestOptions是指向IP头请求选项的IP_OPTION_INFORMATION类型的指针,可以为空。如果没有具体的要求,那么就设置为Long,在调用的时候传0;如果要设定IP头请求选项,那么这里设置为IP_OPTION_INFORMATION类型,在调用的时候传定义为IP_OPTION_INFORMATION类型的变量。
主要代码如下:
Dim RBuffer As ICMP_ECHO_REPLY
Dim pIOI As IP_OPTION_INFORMATION
Dim Realip As String
IcmpHandle = IcmpCreateFile() ‘创建一个Icmp句柄
RData = "Hi,Hello!" ‘
RequestSize = Len(RData) ‘
DAddr = inet_addr(Trim(Text1.Text)) ‘目标机IP地址的长整数形式
Timeout = 1000 ‘超时设置,毫秒
ReplySize = Len(RBuffer) ‘
For i = 1 To 255
pIOI.Ttl = I ‘设置TTL值
DoEvents
r = IcmpSendEcho(IcmpHandle, DAddr, RData, RequestSize, pIOI, RBuffer, ReplySize + 8, Timeout) ‘发送Icmp报文
DoEvents
If r <> 1 Then List1.AddItem "错误,终止": Exit For ‘检测是否出错
Realip = inversaip(RBuffer.Address) ‘将长整型IP转为点数格式字符串IP
List1.AddItem i & " IP " & Realip & ":" & RBuffer.RoundTripTime & "ms"
If Realip = Trim(Text1.Text) Then Exit For ‘比较IP地址,如果相同则到达目标主机
Next
r = IcmpCloseHandle(IcmpHandle) ‘关闭Icmp句柄
程序运行时截图:
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/UruseiBest/archive/2006/12/20/1450418.aspx