1、/掩码长度,用于实现最长 匹配 unsigned int nexthop;/下一跳地址;vector m_table/存储路由表 然后,在路由表项添加函数中,处理路由表项的添加 void stud_route_add(stud_route_msg*proute)routeTableltem newTableltem;newTableltem.masklen=ntohl(proute-masklen);记录掩码长度 newTableltem.mask=(1v(ntohl(proute-masklen)-1);获得掩码 newTableltem.destIP=ntohl(proute-dest)&
2、n ewTableltem.mask;/获取网路 地址段 newTableltem.nexthop=ntohl(proute-nexthop);获取下一条 m_table.push_back(newTableltem);加入路由表 return;每当收到一个新的包时 首先读取包头信息/获取包头信息 int IHL=pBufferO&Oxf;/获取包头长度(bits/32)/cout IHL:IHL endl;int TTL=(int)pBuffer8;/timetolive,存活时间 int headerchecksum=ntohl(*(unsigned short*)(pBuffer+10)
3、;头部校验和 int destIP=ntohl(*(unsigned int*)(pBuffer+16);目的 地址 然后判断此包是否是发给本机的 if(destlP=getlpv4Address()fwd_LocalRcv(pBuffer,length);return 0;判断是否应该丢弃此包 if(TTL=0)fwd_DiscardPkt(pBuffer,STUD_FORWARD_TEST_TTLERROR);return 1;查找最长匹配 for(int i=0;i longestMatchLen&m_tablei.destlP=(destIP&m_tablei.mask)bestMat
4、ch=i;isMatch=true;longestMatchLen=m_tablei.masklen;查找成功,重新计算校验和并发送 if(isMatch)char*buffer=new charlength;memcpy(buffer,pBuffer,length);buffer8 卜-;TTL-1 int sum=0;/重新计算校验和 unsigned short int localCheckSum=0;for(int j=0;j 2*IHL;j+)if(j=5)continue;sum=sum+(bufferj*2 16)!=0)sum=unsigned(sum)16+sum&Oxfff
5、f;localCheckSum=htons(0 xffff-(unsigned short int)sum);memcpy(buffer+10,&localCheckSum,sizeof(unsigned short);/发送 fwd_SendtoLower(buffer,length,m_tablebestMatch.nexthop);查找不成功,丢弃该包 else fwd_DiscardPkt(pBuffer,STUD_FORWARD_TEST_NOROUTE);五、收获 1.对 Ipv4的转发机制有了实际的认识和体会 2.实践了最长匹配算法 六、源代码/*THIS FILE IS FOR
6、 IP FORWARD TEST*/#include syslnclude.h#include using std:vector;#include using std:cout;/system support extern void fwd_LocalRcv(char*pBuffer,int length);extern void fwd_SendtoLower(char*pBuffer,int length,unsigned int nexthop);extern void fwd_DiscardPkt(char*pBuffer,int type);extern unsigned int g
7、etlpv4Address();/implemented by students struct routeTableltem unsigned int destIP;unsigned int mask;unsigned int masklen;unsigned int nexthop;;vector m_table;void stud_Routenit()m_table.clear();return;void stud_route_add(stud_route_msg*proute)routeTableItem newTableItem;newTableltem.mask=(1(ntohl(p
8、route-masklen)-1);newTableltem.destIP=ntohl(proute-dest)&newTableltem.mask;newTableltem.nexthop=ntohl(proute-nexthop);m_table.push_back(newTableltem);int stud_fwd_deal(char*pBuffer,int length)int IHL=pBufferO&0 xf;int headerChecksum=ntohl(*(unsigned short*)(pBuffer+10);int destIP=ntohl(*(unsigned in
9、t*)(pBuffer+16);if(destIP=getlpv4Address()fwd_LocalRcv(pBuffer,length);if(TTL=0)fwd_DiscardPkt(pBuffer,STUD_FORWARD_TEST_TTLERROR);bool isMatch=false;unsigned int longestMatchLen=0;int bestMatch=0;for(int i=0;/cout find one endl;if(isMatch)char*buffer=new charlength;/TTL-1 int sum=0;unsigned short int localCheckSum=0;sum=sum+(buffer2v 16)!fwd_SendtoLower(buffer,length,m_tablebestMatch.nexthop);else fwd_DiscardPkt(pBuffer,STUD_FORWARD_TEST_NOROUTE);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1