程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 我的C/C++之路-005課(模擬路由表的路由選擇功能)

我的C/C++之路-005課(模擬路由表的路由選擇功能)

編輯:關於C語言

[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的專欄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved