当前位置:文档之家› 路由器实验报告

路由器实验报告

路由器实验报告一、简介采用静态路由表采用静态mac表实现双网卡转发采用两个程序分别在两个网卡上抓包和转发二、流程图三、实现步骤①打开所有设备②分别选择两块网卡③在一块网卡上抓包同时过滤④查找路由表若不在路由表中则重新抓包⑤修改目的mac并转发⑥总结上面的是一个程序,另外一个程序于此相同,只不过上面的是在无线网卡上抓包有线网卡上发,另一个是在有线网卡上抓,无线网卡上发采用两个程序,分别在两块网卡上抓包和转发,两个程序同时运行,能够实现路由器的功能四、出现过的问题期末压力较大,没有时间做更细致的,路由表和mac表都采用的静态的,程序运行前设置好一开始使用单线程,单线程总是抓不到回复的包,后来改用两个程序。

不会使用多线程,学习多线程时间上又不允许,只能开两个程序,达到模拟多线程的目的// router.cpp : 定义控制台应用程序的入口点。

//#include "stdafx.h"#include<pcap.h>#include<iostream>#include<Winsock2.h>#include<Windows.h>#include<string>#include<queue>using namespace std;#pragma comment(lib,"ws2_32.lib")#pragma pack(1)typedef struct FrameHeader_t//定义帧首部{//帧字节BYTE DesMAC[6]; //目的地址BYTE SrcMAC[6]; //源地址WORD FrameType; //帧类型}FrameHeader_t;typedef struct ARPFrame_t//ARP帧{FrameHeader_t FrameHeader;WORD HardwareType;WORD ProtocolType;BYTE HLen;BYTE PLen;WORD Operation;BYTE SendHa[6];DWORD SendIP;BYTE RecvHa[6];DWORD RecvIP;}ARPFrame_t;typedef struct IPHEADER_T{//IP首部BYTE Ver_HLen;//版本和报头长度,高4位为版本,低四位为报头长度BYTE TOS;//服务类型WORD TotalLen;//总长度WORD ID;//表示WORD Flag_segment;//标志+片偏移BYTE TTL;//生存周期BYTE Protocol;//协议WORD Checksum;//校验和ULONG SrcIP;//源IPULONG DstIP;//目的IP}IPHeader_t;typedef struct Data_t{//包含帧首部和IP首部的数据包FrameHeader_t FrameHeader;IPHeader_t IPHeader;}Data_t;#pragma pack()struct routersheet{unsigned int netmask;unsigned int dstnet;unsigned int nextnet;};struct macsheet{unsigned int ip;BYTE mac[6];unsigned int ttl;};const int Number=3;routersheet router_sheet[Number]={//子网掩码目的网络下一跳步{inet_addr("255.255.255.0"),inet_addr("192.168.137.0"),inet_addr("112.1 12.112.113")},{inet_addr("255.255.255.0"),inet_addr("192.168.191.0"),inet_addr("255.2 55.255.255")},{inet_addr("255.255.255.0"),inet_addr("112.112.112.0"),inet_addr("255.2 55.255.255")}};macsheet mac_sheet[2]={{inet_addr("112.112.112.113"),{0x8c,0x89,0xa5,0x73,0x4d,0xc0},10000}, {inet_addr("192.168.191.128"),{0x34,0x08,0x04,0xe0,0x2c,0xc6},10000} };const BYTE w_mac[6]={0xac,0x72,0x89,0x5c,0xd1,0xfe};//无限网卡的macconst BYTE l_mac[6]={0x18,0x03,0x73,0x79,0x5e,0x8a};//有线网卡的macint main(){pcap_if_t *alldevs;pcap_if_t *d;pcap_addr_t *a;char errbuf[PCAP_ERRBUF_SIZE];if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,&alldevs,errbuf)==-1)//打开所有设备{cout<<errbuf<<endl;}//输出所有设备int j=1;struct sockaddr_in* my_sin;char* IP;for(d=alldevs;d!=NULL;d=d->next){cout<<"------------------num"<<j<<"------------------"<<endl;cout<<d->name<<endl<<d->description<<endl;for(a=d->addresses;a!=NULL;a=a->next){if(a->addr->sa_family == AF_INET)//判断是否为IP地址{//如果是,则输出my_sin= (sockaddr_in*) a->addr;//强制类型转换,网上查的只有这样才能输出IP=inet_ntoa(my_sin->sin_addr);printf("IP:%s\n",IP);}}j++;}cout<<"选择有线网卡"<<endl;//选择网卡cin>>j;d=alldevs;for(int i=1;i<j;i++){d=d->next;}pcap_t *line;//句柄,打开网卡line=pcap_open(d->name,65536,PCAP_OPENFLAG_PROMISCUOUS,1,NULL,errbuf);cout<<"选择无线网卡"<<endl;//选择网卡cin>>j;d=alldevs;for(int i=1;i<j;i++){d=d->next;}pcap_t *wifi;//句柄,打开网卡wifi=pcap_open(d->name,65536,PCAP_OPENFLAG_PROMISCUOUS,1,NULL,errbuf);pcap_pkthdr *pkt_header;const u_char *pkt_data;Data_t *IPPacket;int ix=0;int s1,s2,s3,s4;int d1,d2,d3,d4;unsigned int source;unsigned int dest;unsigned int tempSource;int flag;while(true){int res1=pcap_next_ex(wifi,&pkt_header,&pkt_data);if(res1==-1){ cout<<"error"<<endl; continue;}if(res1== 0){ /*cout<<"timeout"<<endl;*/ continue;}IPPacket=(Data_t *) pkt_data;if(IPPacket->FrameHeader.FrameType != htons(0x0800)){ continue;}//判断是否为IP包if( (int)((IPPacket->IPHeader.Ver_HLen)>>4) != 4){continue;}//判断是否为ipv4包for(;ix<6;ix++){if(IPPacket->FrameHeader.DesMAC[ix] != w_mac[ix]) break;}if(ix != 6) continue;cout<<"=================无线抓有线发================"<<endl; //输出源IPcout<<"收到一个包来自:";source=IPPacket->IPHeader.SrcIP;source = ntohl(source);s4=source%256; source/=256;s3=source%256; source/=256;s2=source%256; source/=256;s1=source%256;cout<<dec<<s1<<"."<<s2<<"."<<s3<<"."<<s4<<endl;//输出目的IPcout<<"这个包发送到:";dest=IPPacket->IPHeader.DstIP;dest = ntohl(dest);d4=dest%256; dest/=256;d3=dest%256; dest/=256;d2=dest%256; dest/=256;d1=dest%256;cout<<d1<<"."<<d2<<"."<<d3<<"."<<d4<<endl;source=IPPacket->IPHeader.DstIP;tempSource=source;for(flag=0;flag<Number;flag++){tempSource=source & router_sheet[flag].netmask;if(tempSource == router_sheet[flag].dstnet) break;}if(flag == Number) continue;//不在路由表中抛弃if(router_sheet[flag].nextnet == 0xffffffff){source=IPPacket->IPHeader.DstIP;}else{source=router_sheet[flag].nextnet;}for(int i=0;i<6;i++){IPPacket->FrameHeader.SrcMAC[i]=l_mac[i];IPPacket->FrameHeader.DesMAC[i]=mac_sheet[0].mac[i];}if(pcap_sendpacket (line,(u_char *) IPPacket,sizeof(FrameHeader_t)+ntohs(IPPacket->IPHeader.TotalLen) ) ) {cout<<"无线发送失败"<<endl;}else{cout<<"无线发送成功"<<endl;}}return 0;}// router2.cpp : 定义控制台应用程序的入口点。

相关主题