用(目的网络掩码)的结构表示路由表,以一个目的地址作为输入,顺序查找路由表,找出正确的下一跳,并输出.doc_第1页
用(目的网络掩码)的结构表示路由表,以一个目的地址作为输入,顺序查找路由表,找出正确的下一跳,并输出.doc_第2页
用(目的网络掩码)的结构表示路由表,以一个目的地址作为输入,顺序查找路由表,找出正确的下一跳,并输出.doc_第3页
用(目的网络掩码)的结构表示路由表,以一个目的地址作为输入,顺序查找路由表,找出正确的下一跳,并输出.doc_第4页
用(目的网络掩码)的结构表示路由表,以一个目的地址作为输入,顺序查找路由表,找出正确的下一跳,并输出.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机网络实习报告 设 计 题 目 编程查路由表 学生专业班级 学生姓名(学号) 指 导 教 师 完 成 时 间 2010年5月26日 实 习(设计)地点 信息楼139机房 2010 年5月26日计算机网络与通信实习一、编写计算机程序 用(目的网络 掩码 下一跳)的结构表示路由表,以一个目的地址作为输入,顺序查找路由表,找出正确的下一跳,并输出。二、原理概述当IP子网中的一台主机发送IP分组给同一IP子网的另一台主机时,它将直接把IP分组送到网络上,对方就能收到。而要送给不同IP于网上的主机时,它要选择一个能到达目的子网上的路由器,把IP分组送给该路由器,由路由器负责把IP分组送到目的地。如果没有找到这样的路由器,主机就把IP分组送给一个称为“缺省网关(default gateway)”的路由器上。“缺省网关”是每台主机上的一个配置参数,它是接在同一个网络上的某个路由器端口的IP地址。路由器转发IP分组时,只根据IP分组目的IP地址的网络号部分,选择合适的端口,把IP分组送出去。同主机一样,路由器也要判定端口所接的是否是目的子网,如果是,就直接把分组通过端口送到网络上,否则,也要选择下一个路由器来传送分组。路由器也有它的缺省网关,用来传送不知道往哪儿送的IP分组。这样,通过路由器把知道如何传送的IP分组正确转发出去,不知道的IP分组送给“缺省网关”路由器,这样一级级地传送,IP分组最终将送到目的地,送不到目的地的IP分组则被网络丢弃了。三、设计方案1、 从收到的数据报的首部提取目的IP地址D2、 先判断是否为直接交付3、 若路由表中有目的地址为D的特定主机路由,则把数据报传送给路由表中所指明的下一跳路由表4、 对路由表中的每一行,用其中的子网掩码和D逐位相“与”,其结果为N5、 若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;否则执行66、 报告转发分组出错四、程序编写#include #include #include #include #include #include #include using namespace std; class Addr/地址类,4个分量 public: Addr(string str);/构造函数 Addr(const Addr &address);/拷贝构造函数 /ostream& operator (ostream& out,const Addr &object);/向默认输出设备输出,暂不提供 /Addr& operator= (const Addr& object);/发现会造成内存泄漏,所以先取消掉他 bool operator= (const Addr& object); /为了效率,相等操作符只比较整型IP地址,不比较bitset型 Addr& operator&= (const Addr& object); void output();/输出IP地址 Addr(); private: int str_to_int(string str); /这个函数进行字符串到整形数的转换,由于它只是私有函数,所以函数实现中只进行了基本的错误检测,对很多输入错误没有进行检测 inline void set(string str);/把IP地址存到对象中,因为效率,这个函数声明为inline bitset *bin_addr1, *bin_addr2, *bin_addr3, *bin_addr4; /这里把bitset声明成指针类型是因为标准库中只提供构造时从无符号长整型向二进制转换而初始化静态成员只能在类初始化列表中,这时还没获得用于初始化的字符串,所以只能 采用动态的内存管理,给理解上造成少许不便 int int_addr1, int_addr2, int_addr3, int_addr4;/整数分别存IP地址 ; Addr:Addr(std:string str) set(str); Addr:Addr(const Addr &address) int_addr1 = _addr1; int_addr2 = _addr2; int_addr3 = _addr3; int_addr4 = _addr4; bin_addr1 = new bitset(*(address.bin_addr1); bin_addr2 = new bitset(*(address.bin_addr2); bin_addr3 = new bitset(*(address.bin_addr3); bin_addr4 = new bitset(*(address.bin_addr4); Addr:Addr() delete bin_addr1; delete bin_addr2; delete bin_addr3; delete bin_addr4; struct RouteTable Addr* dest;/目的地 Addr* mask;/掩码 int nextdump;/下一跳 ; inline void Addr:set(string str)/把IP地址存到对象中,因为效率,这个函数声明为inline string strtemp; int count = 1; int size = int(str.size(); for(string:iterator pos = str.begin(); pos != str.end(); +pos) if(*pos = .| *pos = |) switch(count) case 1: int_addr1 = str_to_int(strtemp); bin_addr1 = new bitset (unsigned long(int_addr1); break; case 2: int_addr2 = str_to_int(strtemp); bin_addr2 = new bitset (unsigned long(int_addr2); break; case 3: int_addr3 = str_to_int(strtemp); bin_addr3 = new bitset (unsigned long(int_addr3); break; case 4: int_addr4 = str_to_int(strtemp); bin_addr4 = new bitset (unsigned long(int_addr4); break; +count; strtemp.erase(); else strtemp += *pos; return ; int Addr:str_to_int(string str)/这个函数进行字符串到整形数的转换 string:iterator pos = str.begin(); char chtemp; int temp, result = 0; int size = int(str.size(); if(size = 1 & *pos = 0) return 0; for(int i = size; i = 1; -i) chtemp = *pos; switch (chtemp) case 0: temp = 0; break; case 1: temp = 1; break; case 2: temp = 2; break; case 3: temp = 3; break; case 4: temp = 4; break; case 5: temp = 5; break; case 6: temp = 6; break; case 7: temp = 7; break; case 8: temp = 8; break; case 9: temp = 9; break; default: return -1;/不是数字字符,出错 if(i = 3) result = temp*100 + result; else if(i = 2) result = temp*10 + result; else if(i = 1) result = temp + result; else return -1;/防止错误发生 +pos;/迭代器后移 return result; void Addr:output() cout int_addr1 . int_addr2 . int_addr3 . int_addr4 endl; return; /*Addr& Addr:operator= (const Addr &object) int_addr1 = _addr1; int_addr2 = _addr2; int_addr3 = _addr3; int_addr4 = _addr4; bin_addr1 = new bitset(*(object.bin_addr1); bin_addr2 = new bitset(*(object.bin_addr2); bin_addr3 = new bitset(*(object.bin_addr3); bin_addr4 = new bitset(*(object.bin_addr4); return *this; */这里当Addr对象中指针已经有数值的时候,在对他进行赋值操作 /会发生内存泄漏,原来的内存单元无法被释放,所以取消这个函数 bool Addr:operator= (const Addr &object) return (_addr1 = int_addr1 & _addr2 = int_addr2 &_addr3 = int_addr3 & _addr4 = int_addr4); Addr& Addr:operator&= (const Addr &object) *bin_addr1 &= *object.bin_addr1; *bin_addr2 &= *object.bin_addr2; *bin_addr3 &= *object.bin_addr3; *bin_addr4 &= *object.bin_addr4; int_addr1 = int(bin_addr1-to_ulong(); int_addr2 = int(bin_addr2-to_ulong(); int_addr3 = int(bin_addr3-to_ulong(); int_addr4 = int(bin_addr4-to_ulong(); return *this; int loadrt(string filename, list &rt) ifstream infile; infile.open(filename.c_str(); if(!infile) cerr 打开文件失败! dest mask nextdump; temprt = new RouteTable; (*temprt).dest = new Addr(dest); (*temprt).mask = new Addr(mask); (*temprt).nextdump = nextdump; rt.push_back(*temprt); return 0; int main() string filename = e:RouteTable.txt; list rt; loadrt(filename, rt);/从文件载入路由表/destAddr - output();/输出路由表内容 cout 当前路由表内容:n endl; list:iterator rtlist = rt.begin(); int count = 1; while(rtlist != rt.end() cout 第 count 条记录:n; cout output(); cout output(); cout 下一跳: (*rtlist).nextdump n endl; +count; +rtlist; cout 开始模拟路由器转发分组过程:; / system(PAUSE); cout n; cout destnation; cout n; Addr* destAddr = new Addr(destnation);/用子网掩码确定子网 Addr* tempAddr = new Addr(*destAddr); count = 1; for (rtlist = rt.begin(); rtlist != rt.end(); +rtlist) *tempAddr &= *(*rtlist).mask); cout output(); cout 与路由表第 count 条记录记录的子网号相比较:n; if(*tempAddr = *(*rtlist).dest) cout output(); cout 将数据从端口 (*rtlist).nextdump 转发 endl; cout 转发完毕!将结束程序n endl; system(PAUSE); return 0; cout 第 count 次匹配完毕,没有找到目的网络,; system(PAUSE); cout n; +

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论