设为首页 加入收藏

TOP

我的C/C++之路-005课(模拟路由表的路由选择功能)
2014-11-24 00:33:12 来源: 作者: 【 】 浏览:33
Tags:C/C 之路 -005 模拟 路由 选择 功能

[cpp]
#include
#include

/*
模拟路由表的路由选择功能:预先设置路由表,当有一个数据包到来的时候,
查看其目的地址,用该地址与路由表每项的子网掩码相与,若得到的地址与该项地址一致,
则把该数据包从有这个地址的端口转发出去(本例子只适合静态路由,当然没动态路由那么复杂)
*/

//由于路由表长度未知(由路由器管理员添加),不能使用数组了,这里使用链表吧,如果不会,也可以使用数组模拟
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/C++之路-006课(计算输入的.. 下一篇我的C/C++之路-007课(模仿ATM取款..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: