zoukankan      html  css  js  c++  java
  • VC++ 实现获取路由表信息

    所谓路由表,指的是路由器或者其他互联网网络设备上存储的表,该表中存有到达特定网络终端的路径,在某些情况下,还有一些与这些路径相关的度量。
      静态路由表在计算机网络中,路由表或称路由择域信息库(RIB)是一个存储在路由器或者联网计算机中的电子表格(文件)或类数据库。路由表存储着指向特定网络地址的路径(在有些情况下,还记录有路径的路由度量值)。路由表中含有网络周边的拓扑信息。路由表建立的主要目标是为了实现路由协议和静态路由选择。
      在现代路由器构造中,路由表不直接参与数据包的传输,而是用于生成一个小型指向表,这个指向表仅仅包含由路由算法选择的数据包传输优先路径,这个表格通常为了优化硬件存储和查找而被压缩或提前编译。本文将忽略这个执行的详细情况而选择整个路径选择/传输信息子系统作为路由表来说明。


    主要工作


      路由器的主要工作就是为经过路由器的每个数据包寻找一条最佳传输路径,并将该数据有效地传送到目的站点。由此可见,选择最佳路径的策略即路由算法是路由器的关键所在。为了完成这项工作,在路由器中保存着各种传输路径的相关数据——路由表(Routing Table),供路由选择时使用,表中包含的信息决定了数据转发的策略。打个比方,路由表就像我们平时使用的地图一样,标识着各种路线,路由表中保存着子网的标志信息、网上路由器的个数和下一个路由器的名字等内容。路由表可以是由系统管理员固定设置好的,也可以由系统动态修改,可以由路由器自动调整,也可以由主机控制。
        路由来源1.静态路由表
      由系统管理员事先设置好固定的路由表称之为静态(static)路由表,一般是在系统安装时就根据网络的配置情况预先设定的,它不会随未来网络结构的改变而改变。
      2.动态路由表
      动态(Dynamic)路由表是路由器根据网络系统的运行情况而自动调整的路由表。路由器根据路由选择协议(Routing Protocol)提供的功能,自动学习和记忆网络运行情况,在需要时自动计算数据传输的最佳路径。
      路由器通常依靠所建立及维护的路由表来决定如何转发。路由表能力是指路由表内所容纳路由表项数量的极限。由于Internet上执行BGP协议的路由器通常拥有数十万条路由表项,所以该项目也是路由器能力的重要体现。
      路由表项如下:
      首先,路由表的每个项的目的字段含有目的网络前缀。其次,每个项还有一个附加字段,还有用于指定网络前缀位数的子网掩码(subnet mask).第三,当下一跳字段代表路由器时,下一跳字段的值使用路由的IP地址。
      理解网际网络中可用的网络地址(或网络 ID)有助于路由决定。这些知识是从称为路由表的数据库中获得的。路由表是一系列称为路由的项,其中包含有关网际网络的网络 ID 位置信息。路由表不是对路由器专用的。主机(非路由器)也可能有用来决定优化路由的路由表。


    路由表项的类型


      路由表中的每一项都被看作是一个路由,并且属于下列任意类型:
      · 网络路由
      网络路由提供到网际网络中特定网络 ID 的路由。
      · 主路由
      主路由提供到网际网络地址(网络 ID 和节点 ID)的路由。主路由通常用于将自定义路由创建到特定主机以控制或优化网络通信。
      · 默认路由
      如果在路由表中没有找到其他路由,则使用默认路由。例如,如果路由器或主机不能找到目标的网络路由或主路由,则使用默认路由。默认路由简化了主机的配置。使用单个默认的路由来转发带有在路由表中未找到的目标网络或网际网络地址的所有数据包,而不是为网际网络中所有的网络 ID 配置带有路由的主机。
      路由表结构
      下面的图解显示了路由表的结构。
      ART 图像
      路由表中的每项都由以下信息字段组成:
      · 网络 ID
      主路由的网络 ID 或网际网络地址。在 IP 路由器上,有从目标 IP 地址决定 IP 网络 ID 的其他子网掩码字段。
      · 转发地址
      数据包转发的地址。转发地址是硬件地址或网际网络地址。对于主机或路由器直接连接的网络,转发地址字段可能是连接到网络的接口地址。
      · 接口
      当将数据包转发到网络 ID 时所使用的网络接口。这是一个端口号或其他类型的逻辑标识符。
      · 跃点数
      路由首选项的度量。通常,最小的跃点数是首选路由。如果多个路由存在于给定的目标网络,则使用最低跃点数的路由。某些路由选择算法只将到任意网络 ID 的单个路由存储在路由表中,即使存在多个路由。在此情况下,路由器使用跃点数来决定存储在路由表中的路由。
      注意
      · 前面的列表是路由器所使用的路由表中字段的典型列表。不同的可路由协议路由表中的实际字段可能会改变。


    静态路由表


      由系统管理员事先设置好固定的路由表称之为静态(static)路由表,一般是在系统安装时就根据网络的配置情况预先设定的,它不会随未来网络结构的改变而改变。
      静态路由
      静态路由是由管理员在路由器中手动配置的固定路由,路由明确地指定了包到达目的地必须经过的路径,除非网络管理员干预,否则静态路由不会发生变化。静态路由不能对网络的改变作出反应,所以一般说静态路由用于网络规模不大、拓扑结构相对固定的网络。
      静态路由特点:
      1、它允许对路由的行为进行精确的控制
      2、减少了网络流量
      3、是单向的
      4、配置简单


    动态路由表


      动态(Dynamic)路由表是路由器根据网络系统的运行情况而自动调整的路由表。路由器根据路由选择协议(Routing Protocol)提供的功能,自动学习和记忆网络运行情况,在需要时自动计算数据传输的最佳路径。


    路由表能力


      路由表能力是指路由表内所容纳路由表项数量的极限。由于Internet上执行BGP协议的路由器通常拥有数十万条路由表项,所以该项目也是路由器能力的重要体现。


    路由表(Routing Table)


      路由器的主要工作就是为经过路由器的每个数据帧寻找一条最佳传输路径,并将该数据有效地传送到目的站点。由此可见,选择最佳路径的策略即路由算法是路由器的关键所在。为了完成这项工作,在路由器中保存着各种传输路径的相关数据——路由表(Routing Table),供路由选择时使用。打个比方,路由表就像我们平时使用的地图一样,标识着各种路线,路由表中保存着子网的标志信息、网上路由器的个数和下一个路由器的名字等内容。路由表可以是由系统管理员固定设置好的,也可以由系统动态修改,可以由路由器自动调整,也可以由主机控制


    路由表配置


      路由器连接两个主机,那路由器肯定要使用两个端口,而且都要配置IP地址,你没有告诉我哦,不过本着一根网线的两端的IP必须在同一子网内,那么我假设路由器连接主机192.168.16.2使用Eth 0,IP为192.168.16.1,连接主机192.168.17.2使用Eth 1,IP为192.168.17.1(这样分配你能理解吗?)。 你要求的静态路由,但一台路由器好像不能配置静态路由。也可以用动态路由协议的方式实现,简单好用。我就用CISCO的路由器讲解一下。 先说动态的吧:使用RIP协议 enable configure terminal router rip network 192.168.16.0 network 192.168.17.0



    #include "dnet.h"   
    /*  
    =======================================================================================================================  
    Libdnet头文件 ;  
    下面的函数是回调函数,它在函数route_loop()中调用,它的功能是对路由表进行操作,在这里是显示路由表信息  
    =======================================================================================================================  
     */   
    int show_route_rule(const struct route_entry *entry, void *arg)   
    {   
        printf("Destination :%s  =======  Gateway :%s\n", addr_ntoa(&entry->route_dst), addr_ntoa(&entry->route_gw));   
        /* 显示路由表记录 */   
        return (0);   
    }   
    int main(int argc, char *argv[])   
    {   
        struct route_entry entry;   
        /* 路由表的数据结构的变量 */   
        route_t *handle;   
        /* 路由表操作句柄 */   
        handle = route_open();   
        /* 打开路由表操作 */   
        printf("Show the route rules:\n");   
        printf("Route rules :\n");   
        printf("Destination IP  ----------------------- Gateway IP\n");   
        route_loop(handle, show_route_rule, NULL);   
        /*  
         * 注册回调函数show_route_rule,循环调用回调函数对路由表进行操作,这里是显示所有路由表信息  
         */   
        printf("Show the route rules about the Destination IP:\n");   
        addr_aton("192.168.0.4", &entry.route_dst);   
        /* 把字符串形式的IP地址转换为二进制形式的IP地址 */   
        route_get(handle, &entry);   
        /* 根据地址获取其路由表信息 */   
        printf("Destination is :\n");   
        printf("%s\n", addr_ntoa(&entry.route_dst));   
        /* 输出目的地址 */   
        printf("Gateway is: \n");   
        printf("%s\n", addr_ntoa(&entry.route_gw));   
        /* 输出网关地址 */   
        printf("Add a route rule :\n");   
        addr_aton("192.168.0.5", &entry.route_dst);   
        /* 把字符串形式的IP地址转换为二进制形式的IP地址 */   
        addr_aton("192.168.0.10", &entry.route_gw);   
        /* 把字符串形式的IP地址转换为二进制形式的IP地址 */   
        route_add(handle, &entry);   
        /* 添加路由表记录 */   
        printf("Destination :%s Gateway :%s added:\n", addr_ntoa(&entry.route_dst), addr_ntoa(&entry.route_gw));   
        printf("Add a route rule :\n");   
        addr_aton("192.168.0.6", &entry.route_dst);   
        /* 把字符串形式的IP地址转换为二进制形式的IP地址 */   
        addr_aton("192.168.0.20", &entry.route_gw);   
        /* 把字符串形式的IP地址转换为二进制形式的IP地址 */   
        route_add(handle, &entry);   
        /* 添加路由表记录 */   
        printf("Destination :%s Gateway :%s added:\n", addr_ntoa(&entry.route_dst), addr_ntoa(&entry.route_gw));   
        printf("Show the route rules:\n");   
        printf("Route rules :\n");   
        printf("Destination IP  ----------------------- Gateway IP\n");   
        route_loop(handle, show_route_rule, NULL);   
        /* 显示所有路由表记录 */   
        printf("Delete a route rule :\n");   
        addr_aton("192.168.0.5", &entry.route_dst);   
        /* 把字符串形式的IP地址转换为二进制形式的IP地址 */   
        route_delete(handle, &entry);   
        /* 删除路由表记录 */   
        printf("Destination :%s deleted\n", addr_ntoa(&entry.route_dst));   
        printf("Show the route rules:\n");   
        printf("Route rules :\n");   
        printf("Destination IP  ----------------------- Gateway IP\n");   
        route_loop(handle, show_route_rule, NULL);   
        /* 再显示所有路由表记录 */   
        route_close(handle);   
        /* 关闭路由表操作 */   
    }   


  • 相关阅读:
    Opensource .NET and Mono REST Web Services framework.NET Community Content on InfoQ Servicestack
    动态软件框架开发模型图
    数据库镜像
    DDD:策略模式如何结合动态表达式
    CentOS下j2ee环境搭建
    C#代码段编辑/编译工具
    .NET平台下不借助Office实现Word、Powerpoint等文件的解析(完)
    .NET Attribute(特性)的作用与用法
    tornado开发输入输出,数据库操作,内置模板,综合示例
    基于事件的异步编程模式(EMP)
  • 原文地址:https://www.cnblogs.com/new0801/p/6177681.html
Copyright © 2011-2022 走看看