《监控IP数据包流量.doc》由会员分享,可在线阅读,更多相关《监控IP数据包流量.doc(10页珍藏版)》请在三一办公上搜索。
1、 沈阳理工大学课程设计专用纸 No9目 录1 课程设计目的12 课程设计要求13相关知识14课程设计分析15程序代码36运行结果与分析87参考文献9沈阳理工大学1 课程设计目的IP协议是TCP/IP协议簇中的核心协议。熟悉IP协议对于理解TCP/IP协议结构具有重要意义。本课程设计的主要目的是通过监控IP包流量,了解IP协议的工作原理与IP数据包的基本结构。2 课程设计要求根据后面介绍的IP数据包结构,编写程序监控IP数据包的流量。1) 以命令行形式运行:MonitorTraffic time其中,MonitorTraffic为程序名,time为设定的监控时间(单位为分钟)。2)输出内容:按源
2、地址统计该时间内发送的IP包的个数。3 相关知识IP是TCP/IP协议体系中的网络层协议。TCP、UDP、ICMP和IGMP等其他协议都是以IP协议为基础的。IP协议的特点如下:1) IP协议是一种不可靠、无连接的数据包传送协议。2) IP协议是点对点的网路层通信协议。3) IP协议传输层隐藏了物理网络的差异。4课程设计分析我们的课程设计涉及到winpcap编程。我们下载了相关软件,其中包含了wpdpack头文件包,解压后出现了下列五个文件夹:docs、example-pcap、example-remote、include、lib。在vc中设定include目录。具体做法如下:toolsopt
3、iondirectories,在include files中添加wpdpackinclude目录;在library files中添加wpdpacklib目录。接下来进行库函数的设定:在projectsettingslink中的object/library modules中添加wpcap.lib。至此,winpcap编程在vc中的编写步骤便告一段落了。然后是对源文件的编写,其流程图如下:开始获取网卡列表选取Ethernet网卡打开网卡(混杂模式)编译设置过滤器捕获IP包将IP包源地址加入链表是否超时?输出链表内容结束图2-15 程序代码#include #include #pragma comm
4、ent(lib,wpcap.lib)#pragma comment(lib,ws2_32.lib)using namespace std;/IP包头部struct IP_HEAD unsigned char ver_ihl; /版本号+头部长度 unsigned char tos; /服务类型 unsigned short tlen; /总长度 unsigned short id; /标识 unsigned short flags; /标志+片偏移 unsigned char ttl; /生存时间 unsigned char proto; /协议 unsigned short crc; /校验
5、和 DWORD saddr; /源地址 DWORD daddr; /目的地址 unsigned int op_pad; /选项+填充;/IP结点类classIP_NODE private: long SOURCE_ADDRESS ; /IP包的源地址 long COUNT; /IP包的个数 public: IP_NODE *pNext; /构造函数 IP_NODE(long sourceIP) m_lIPAddress=sourceIP; COUNT=1; /IP包的个数加1 void addCount() COUNT+; /返回IP包的个数 long GET_COUNT() return C
6、OUNT; /返回IP包的源地址 long GET_IP_ADDRESS() return SOURCE_ADDRESS ;/IP结点链表类class NODE_LIST IP_NODE *pHead; /链表头 IP_NODE *pTail; /链表尾 public: NODE_LIST() pHead=pTail=NULL; NODE_LIST() if(pHead!=NULL) IP_NODE *pTemp=pHead; pHead=pHead-pNext; delete pTemp; /IP节点加入链表 void addNode(long sourceIP) /链表是否为空 if(pH
7、ead=NULL) pTail=newIP_NODE(sourceIP); pHead=pTail; pTail-pNext=NULL; else for(IPNode *pTemp=pHead;pTemp;pTemp=pTemp-pNext) /如果链表中存在此IP,IP包个数加1 if(pTemp-GET_IP_ADDRESS()=sourceIP) pTemp-addCount(); break; /如链表中没有此IP,则加入链表 if(pTemp-GET_IP_ADDRESS()!=sourceIP) pTail-pNext=newIP_NODE(sourceIP); pTail=pT
8、ail-pNext; pTail-pNext=NULL; /输出IP节点的内容 ostream &print(ostream &out) for(IPNode *pTemp=pHead;pTemp;pTemp=pTemp-pNext) long lTemp=pTemp-GET_IP_ADDRESS(); outinet_ntoa(*(in_addr*)&(lTemp)t; outGET_COUNT()endl; return out; ;int main(int argc,char *argv) /检查输入格式命令 if(argc!=2) coutplease input command:IP
9、Statistic time:endl; return -1; /初始化网卡相关参数 double min=atof(argv1); pcap_if_t *alldevs; /网卡结构 pcap_if_t *d,*head=NULL; pcap_t *fp; /网卡描述符 char errbufPCAP_ERRBUF_SIZE; unsigned int netmask; /子网掩码 char packet_filter=ip; struct bpf_program fcode; struct pcap_pkthdr *header; const unsigned char *pkt_data
10、; /获取网卡列表 if(pcap_findalldevs(&alldevs,errbuf)=-1) coutUnable to create adapter list!next) cout+i:name; if(d-description) cout descrptionendl; /没有发现网卡 if(i=0) coutNo adapter found!endl; return -1; /选择要使用的网卡 coutEnter the interface number (1-ik; if(ki) coutOut of range!endl; return -1; for(d=alldevs,
11、i=1;inext,i+); head=d; /以混杂模式打开网卡 if(fp=pcap_open_live(head-name,1000,1,1000,errbuf)=NULL) coutUnable to open the adapter.addresses!=NULL) netmask=(struct sockaddr_in*)(head-addresses-netmask)-sin_addr.S_un.S_addr; else netmask=0xffffff; /编译捕获过滤器 if(pcap_compile(fp,&fcode,packet_filter,1,netmask)0)
12、coutUnable to compile the filter!endl; pcap_freealldevs(alldevs); return -1; /设置捕获过滤器 if(pcap_setfilter(fp,&fcode)0) coutUnable to set the filter!=0) time(&end); if(end-beg=min*60) break; if(res=0) continue; IP_HEAD *ih; ih=(IP_HEAD *)(pkt_data+14); link.addNode(ih-saddr); pcap_freealldevs(alldevs); /显示统计信息 coutIP Statistic inminminutes:endl; coutSource Address Packet Numberendl; link.print(cout); return 0;6运行结果与分析运行结果如下:图4-1如图4-1所示,监控到来自IP地址为169.254.113.66在1min内传送的568个数据包。运行结果正确,达到实验目的。7参考文献1谢希仁 编著. 计算机网络 (第5版) .北京:电子工业出版社,20082吴宜功 吴英 编著. 计算机网络课程设计 (第2版). 北京: 机械工业出版社,2012