资源简介
在linux环境下模拟了基本的静态路由,网络搭建在几台虚拟机之间。

代码片段和文件信息
#include
#include
#include
#include
#include
#include
#include
#include
#define MAX_ROUTE_INFO 8;
#define MAX_ARP_SIZE 8;
#define MAX_DEVICE 4;
#define BUFFER_MAX 2048
typedef struct route_item{
unsigned int destination;
unsigned int gateway;
unsigned int netmask;
unsigned char interface[14];
};
struct route_item route_info[8];
int route_item_index;
typedef struct arp_table_item{
unsigned int ip_addr;
unsigned char mac_addr[6];
};
struct arp_table_item arp_table[8];
int arp_item_index;
typedef struct device_item{
unsigned char interface[14];
unsigned char mac_addr[6];
unsigned int ip_addr;
};
struct device_item device[4];
int device_index;
/*初始化函数,首先是把你的静态路由信息添加到你的route_info[]这个数组中
我在自己机器上时如下添加的,具体情况根据你的网络拓扑情况添加
参照linux自带的路由结构,destination表示的是目的网络号,gateway表示要经过
的网关,如果为零说明已经到达最后一个路由节点,下一条就是目的地,netmask:
用来提取目的网络号:实际操作时把netmask 和 ip报文内的目的地址进行按位与操
作,然后把结果同当前的目的网络号对比
下面说一下device[]这个数组,它用来存放路由的网卡信息的,比如说你在终端中输
入ifconfig后,会出现一些网卡的信息,比如说eth0,在里面找到MAC和IP,填入我
的device[]数组中
*/
void initial()
{
route_item_index = 3;
route_info[0].destination = inet_addr(“192.168.2.0“);
route_info[0].gateway = inet_addr(“192.168.1.2“);
route_info[0].netmask = inet_addr(“255.255.255.0“);
strcpy(route_info[0].interface “eth0“);
route_info[1].destination = inet_addr(“192.168.1.0“);
route_info[1].gateway = 0;
route_info[1].netmask = inet_addr(“255.255.255.0“);
strcpy(route_info[1].interface “eth0“);
route_info[2].destination = inet_addr(“192.168.0.0“);
route_info[2].gateway = 0;
route_info[2].netmask = inet_addr(“255.255.255.0“);
strcpy(route_info[2].interface “eth1“);
arp_item_index = 0;
device_index = 2;
strcpy(device[0].interface “eth0“);
device[0].mac_addr[0] = 0X00;
device[0].mac_addr[1] = 0X0C;
device[0].mac_addr[2] = 0X29;
device[0].mac_addr[3] = 0XE3;
device[0].mac_addr[4] = 0X25;
device[0].mac_addr[5] = 0X86;
device[0].ip_addr = inet_addr(“192.168.1.1“);
strcpy(device[1].interface “eth1“);
device[1].mac_addr[0] = 0X00;
device[1].mac_addr[1] = 0X0C;
device[1].mac_addr[2] = 0X29;
device[1].mac_addr[3] = 0XE3;
device[1].mac_addr[4] = 0X25;
device[1].mac_addr[5] = 0X90;
device[1].ip_addr = inet_addr(“192.168.0.1“);
};
void UpdateArpTable(unsigned char Iface[] int n unsigned int target)
{
int sockfdij;
sockfd = socket(PF_INET SOCK_PACKET htons(ETH_P_ARP));
char buffer[BUFFER_MAX];
struct sockaddr tofrom;
int fromlen=sizeof(struct sockaddr);
strcpy(to.sa_dataIface);
strcpy(from.sa_dataIface);
char datagram[BUFFER_MAX];
struct ethhdr *eth_header = datagram;
struct arphdr *arp_header = datagram + sizeof(struct ethhdr);
memset (datagram 0 BUFFER_MAX);
for(i = 0;i < 6; i++)
eth_header->h_dest[i] = 0XFF;
int flag;
for(i = 0;i < 2; i++)
if(strcmp(Iface
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
.CA.... 9148 2010-04-12 22:36 route.c
.CA.... 65334 2009-12-14 02:19 实验4 静态路由编程实现.docx
----------- --------- ---------- ----- ----
74482 2
相关资源
- 04741计算机网络原理知识点整理.docx(
- uboot到linux logo显示不间断 补丁
- UNIX/LINUX编程实践教程的源码
- Linux任务管理器
- linux应用层的华容道游戏源代码
- 校园网络规划与设计课程设计
- ubuntu9.10 可加载内核模块和字符设备驱
- MP3文件ID3v2ID3v2APEv2标签读取
- 操作系统实验——虚存管理实验
- linux下的发包工具sendip
- 尚观培训linux许巍关于c 的笔记和讲义
- 尚观培训linux董亮老师关于数据结构的
- linux 线程池源码 c 版
- linux C 电梯程序练习
- linux下用多进程同步方法解决生产者
- SOCKET 网络编程 计算机网络 作业 客户
- Linux 操作系统实验(全)
- Linux From Scratch 中文手册
- 计算机网络课程设计—ARQ协议模拟实
- linux 网络实验 ftp程序
- Linux命令大全离线版&在线版
- 操作系统共享内存实验
- dos 下运行Linux 命令--gnu_utils
- linux 0.12内核源代码
- linux简易shell C实现
- linux实验报告及心得体会
- 基于GTK的Linux环境下的简易任务管理器
- linux扫雷游戏代码
- CAN Linux驱动代码
- Linux系统教材
评论
共有 条评论