当前位置:编程学习 > C/C++ >>

我的C/C++之路-005课(模拟路由表的路由选择功能)

[cpp]
#include<stdio.h> 
#include<stdlib.h> 
 
/*
模拟路由表的路由选择功能:预先设置路由表,当有一个数据包到来的时候,
查看其目的地址,用该地址与路由表每项的子网掩码相与,若得到的地址与该项地址一致,
则把该数据包从有这个地址的端口转发出去(本例子只适合静态路由,当然没动态路由那么复杂)
*/ 
 
//由于路由表长度未知(由路由器管理员添加),不能使用数组了,这里使用链表吧,如果不会,也可以使用数组模拟 
typedef struct RouteNode 

    int ip[4];//ip 
    int subnetMask[4];//子网掩码 
    int port;//数据包送出的接口号,这里简单的使用INT类型(实际情况不是这样的) 
    struct RouteNode * next;//下一项路由记录 
 
}RouterTableList; 
 
void routerTableArithmetic(); 
void inputRouterTable(RouterTableList *&rtl); 
void addRouteNode(RouterTableList *&rtl,int ip[],int subnetMask[],int port); 
void displayRouterTable(RouterTableList *rtl); 
int findPort(RouterTableList *rtl,int dist_ip[]); 
//数据包转发决策函数 
void routerTableArithmetic() 

    int dist_ip[4] = {192,168,2,110};//数据包目的地址 
     
    RouterTableList * rtl; 
    inputRouterTable(rtl); 
    printf("********** print route table **************\n"); 
    displayRouterTable(rtl); 
    int port = findPort(rtl,dist_ip); 
    if(port==-1) printf("***** 没有找到记录,不找到从哪里转发出去 ******\n"); 
    else 
    printf("********** 数据包将从路由器的端口 %d 转发出去**************\n",port); 

//输入路由表 
void inputRouterTable(RouterTableList *&rtl) 

    rtl = (RouterTableList *)malloc(sizeof(RouterTableList));//头结点分配空间 
    rtl->next = NULL; 
    //加入路由条目,这里加3条,大家可以自己设计下,弄个函数什么的 
    int ip[4] = {192,168,1,0};//输入的是一个网段,不是具体IP,路由配置也是这样的 
    int subnetMask[] = {255,255,255,0}; 
    addRouteNode(rtl,ip,subnetMask,1); 
    int ip2[4] = {192,168,2,0}; 
    addRouteNode(rtl,ip2,subnetMask,2); 
    int ip3[4] = {192,168,3,0}; 
    addRouteNode(rtl,ip3,subnetMask,3);  

//路由节点 
void addRouteNode(RouterTableList *&rtl,int ip[],int subnetMask[],int port) 

    RouterTableList * node,*find;//find是为了保存链表最后一个节点 
    node = (RouterTableList *)malloc(sizeof(RouterTableList));//分配空间 
    for(int i=0;i<4;i++) 
    { 
        node->ip[i] = ip[i]; 
    } 
    for(i=0;i<4;i++) 
    { 
        node->subnetMask[i] = subnetMask[i]; 
    } 
    node->port = port; 
    node->next = NULL; 
     
    find = rtl; 
    while(find->next !=NULL) 
    { 
        find = find->next; 
    } 
    find->next = node; 

//查找从哪个端口输出数据包 
int findPort(RouterTableList *rtl,int dist_ip[]) 

    RouterTableList * node = rtl->next; 
    int i; 
    while(node!=NULL) 
    { 
        for(i=0;i<4;i++) 
            if((dist_ip[i]&node->subnetMask[i])!=node->ip[i]) break; 
 
        if(i>=4) return node->port; 
        node = node->next; 
    } 
    return -1;//-1为找不到记录 

//输出路由表 
void displayRouterTable(RouterTableList *rtl) 

    RouterTableList * node = rtl->next; 
    while(node!=NULL) 
    { 
        printf("IP: %d.%d.%d.%d   subnetMask: %d.%d.%d.%d   port: %d \n",node->ip[0],node->ip[1],node->ip[2],node->ip[3], \ 
            node->subnetMask[0],node->subnetMask[1],node->subnetMask[2],node->subnetMask[3],node->port); 
        node = node->next; 
    } 

花了三个小时,挺悲剧的,不过最后还是做了想要的功能--模拟路由表的路由选择功能

功能简单,用了后面的一些知识(以前学过,就直接用了,不懂的朋友可以不用看),还是老话:不懂请留言,大牛绕路走



摘自 mzlqh的专栏
补充:软件开发 , C语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,