我的C/C++之路-005课(模拟路由表的路由选择功能)
2012-04-22 20:54
232 查看
#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; } }
花了三个小时,挺悲剧的,不过最后还是做了想要的功能--模拟路由表的路由选择功能
功能简单,用了后面的一些知识(以前学过,就直接用了,不懂的朋友可以不用看),还是老话:不懂请留言,大牛绕路走
相关文章推荐
- TCP/IP协议原理与应用笔记23:路由选择模块 和 路由表的设计
- 模拟路由功能
- jQuery模拟12306城市选择框功能简单实现方法示例
- 通过up、down、enter键实现搜索结果选择功能(模拟搜索引擎)
- Java实现模拟路由功能
- Java实现模拟路由功能
- 模拟dubbo 框架RPC调用及dubbo的服务动态注册,服务路由,负载均衡功能的思考
- 路由表。路由选择
- 脚本控制向Android模拟拨打电话,发送短信,定位设置功能
- C#的TabControl模拟IE7程序事例,带关闭功能
- 一款带农历的日期选择器,功能很强大!
- CISCO 模拟软件 dynamips 路由模拟器使用简介及免费下载_冰冷轩
- Win7系统如何使用反向选择功能来筛选需要保留的图片
- Qt 根据菜单选项组(单选)选择的item对应选择的功能
- Android 系统下模拟触点击的功能与权限
- mysql和oracle的区别(功能性能、选择、使用它们时的sql等对比)
- 用javascript实现网页地区选择功能
- BGP的消息类型、路由选择和配置命令
- 轻松搞定RabbitMQ(五)——路由选择
- IP路由选择过程