WEB开发网
开发学院软件开发VC 使用ICMP实现路由跟踪 阅读

使用ICMP实现路由跟踪

 2010-06-27 20:40:36 来源:WEB开发网   
核心提示:三、路由跟踪的实现方法路由跟踪的实现就是巧妙地利用了ICMP报文的TTL超时报文,其实现过程如下:源主机先向目的主机发送一个回应请求报文(类型8),使用ICMP实现路由跟踪(2),TTL值设为1,第一个路由器收到后将TTL减1,然后点OK,这样就新建了一个CICMP类,这样TTL变为0,分组被废除

三、路由跟踪的实现方法

路由跟踪的实现就是巧妙地利用了ICMP报文的TTL超时报文。其实现过程如下:源主机先向目的主机发送一个回应请求报文(类型8),TTL值设为1,第一个路由器收到后将TTL减1,这样TTL变为0,分组被废除,同时路由器向源主机发送一个TTL超时报文(类型为11),报文的IP包头中的源IP地址就是第一个路由器的地址,源主机就可以通过对该报文进行分析,得到第一个路由器的地址。接着发送TTL等于2的报文得到第二个路由器地址,再发TTL等于3的报文,如此下去直到收到目的主机的回应应答报文(类型为0)或目的不可达报文(类型为3),或者到了最大跳数(要检测路由器个数的最大值)。可以看到,对TTL的设置是实现跟踪的关键,使用函数setsockopt(m_Sock, IPPROTO_IP, IP_TTL,(LPSTR)&TTL,sizeof(int)) 可以对其进行设置,m_Sock是所创建的套接字,IP_TTL说明是进行TTL设置,TTL即是要设置的TTL值,为一个整形数值 。其实现流程可用下图2表示:

(图2) 流程图

四、程序实现

本文所介绍的程序是使用了Visual C++6.0编写,其过程如下:

1、创建一个新的基于对话框的AppWizard工程,并命名为RouteTrace。

2、在stdafx.h中加入#include "winsock2.h"。

3、打开选择菜单Project->Setting (ALT+F7),进入Project Setting 对话框,在Link下的 Object/library modules 输入ws2_32.lib,然后点OK。

4、自定义一个ICMP类。点击菜单中的Insert->New Class,进入New Class对话框,在Class type中选择Generic Class,在Name中输入类名CICMP,然后点OK,这样就新建了一个CICMP类。

5、将对话框设置成如图3所示的样子:

(图3 程序界面)

启动Class Wizard 为各控件添加响应函数和关联变量,控件对应的ID及响应函数或变量为:

控件 ID 响应函数 变量
地址组合框 IDC_COMBO   CComboBox m_comb
最大跳数编辑框 IDC_MAXHOT   int m_maxhot
跟踪按钮 IDC_TRACE OnTrace()  
停止按钮 IDC_STOP OnStop()  
列表框 IDC_LIST   CListCtrl m_list

Tags:使用 ICMP 实现

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接