VC下使用ICMP实现路由跟踪(二)

2012-11-04 15:24:11 · 作者: · 浏览: 502
  三、路由跟踪的实现方法

  路由跟踪的实现就是巧妙地利用了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++(www.cppentry.com)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_COMBOCComboBoxm_comb
最大跳数编辑框IDC_MAXHOTintm_maxhot
跟踪按钮IDC_TRACEOnTrace()  
停止按钮IDC_STOPOnStop() 
列表框IDC_LISTCListCtrlm_list