我的C/C++之路-005课(模拟路由表的路由选择功能)
来源:互联网 发布:贪心算法 动态规划 编辑:程序博客网 时间:2024/05/10 19:26
#include<stdio.h>#include<stdlib.h>/*模拟路由表的路由选择功能:预先设置路由表,当有一个数据包到来的时候,查看其目的地址,用该地址与路由表每项的子网掩码相与,若得到的地址与该项地址一致,则把该数据包从有这个地址的端口转发出去(本例子只适合静态路由,当然没动态路由那么复杂)*///由于路由表长度未知(由路由器管理员添加),不能使用数组了,这里使用链表吧,如果不会,也可以使用数组模拟typedef struct RouteNode{int ip[4];//ipint 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");elseprintf("********** 数据包将从路由器的端口 %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;}}
花了三个小时,挺悲剧的,不过最后还是做了想要的功能--模拟路由表的路由选择功能
功能简单,用了后面的一些知识(以前学过,就直接用了,不懂的朋友可以不用看),还是老话:不懂请留言,大牛绕路走
- 我的C/C++之路-005课(模拟路由表的路由选择功能)
- 大亚DB102-C的ADSL modem的路由功能
- elasticsearch的路由选择
- Thinkphp 的路由功能
- 模拟路由功能
- 用C#实现IP的路由跟踪- -
- 路由选择协议的分类
- BGP选择路由的策略
- 因特网的路由选择协议
- 因特网的路由选择协议
- 路由选择协议的分类
- 常见的路由选择算法
- 浅谈路由器的路由功能
- 打开windows的路由功能
- 打开windows的路由功能
- 我的e家,华为HG522 HG522-C ADSL猫破解路由 WIFI教程
- RabbitMQ之路由选择
- 路由模拟——路由算法1的构想
- poj-2965
- 一个java正规表达式工具类
- VS2005新建应用工程出错解决方法
- N年时间下来读书的感觉差异
- 微博文摘——女人与ITIL
- 我的C/C++之路-005课(模拟路由表的路由选择功能)
- 辨析这几个概念:dBi,dBd,dBc,dBm,dB
- Linux内核设计与实现——7 中断与中断处理(5)——注册中断处理程序
- 高手讲解php调用url的N种方法
- ORA-01152: file 1 was not restored from a sufficiently old backup ORA-01110: data file 1: '/u01/app
- Oracle分析函数八——CUBE,ROLLUP
- springMVC web请求处理流程
- Objective-C 编程语言(6)类别与扩展----为类增加方法
- ubuntu 桌面 终端 控制台 Bash Shell 命令行编辑 快捷键