ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:74.69KB ,
资源ID:488001      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-488001.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(网络程序设计IP数据包流量统计.docx)为本站会员(b****1)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

网络程序设计IP数据包流量统计.docx

1、网络程序设计IP数据包流量统计一、 题目及要求(一)题目:IP数据包流量统计(二)要求:编制程序,监控网络,捕获一段时间内网络上的IP数据包,按IP数据包的源地址统计出该源地址在该时间段内发出的IP包的个数,将其写入日志文件中或用图形表示出来(建议用图形表示出统计结果)。用命令行运行:IPSta time logfile;其中IPSta是程序名,time是设定的统计时间间隔,logfil表示统计结果写入的日志文件名(若用图形表示统计结果则可以不选这个参数)。或在此基础上用图形化界面实现上述功能。二、 系统概要设计(一) 流量统计主要功能模块图图中取得网络适配器列表主要是得到网卡的相关信息,即网

2、卡的个数、连接情况等,选择要监听的网络适配器就是要用户选择网卡,编译并设置过滤器是为了只捕获网络数据流的某些数据,将网络适配器设置为统计模式就是接受所有经过网卡的数据包,包括不是发给本机的数据包,接下来的任务就是开始主循环调用回调函数来显示网络流量了。(二) 程序流程图图中获取网卡列表是为了得到网卡的相关信息,以便于用户进行选择,选取Ethermet网卡是用户所选择的网卡类型,编译设置过滤器是为了编译并设置过滤器是为了只捕获网络数据流的某些数据,打开网卡既将网卡设置为混杂(统计)模式是为了接受所有经过网卡的数据包,包括不是发给本机的数据包,开始主循环以是否超时为判断条件,循环体内主要有捕获IP

3、数据包、将IP包的源地址加入链表、条件判断,循环结束后输出链表内容,程序至此结束。三、系统详细设计1. 取得网络适配器列表/取得网络适配器列表步骤中,alldevs是pcap_if_it指针,指向链表头,errbuf是char类型数组,存储错误信息3。pcap_findalldevs(&alldevs,errbuf);cout”网络适配器列表:”next)cout+i:name;if (d-description)coutdescription;elsecoutNo description available!n; 2. 指定要监听的网络适配器并打开cout”输入要监听的网络适配器号:”inu

4、m;for(d=alldevs,i=0;inext,i+);fp=pcap_open_live(d-name,65536,1,1000,errbuf);3. 编译并设置过滤器/编译过滤器,fp指向打开的网络适配器,fcode为编译完成后的过滤器存储地址,“tcp“给出了过滤条件,下一个参数表示是否被优化(0为false,1为true),最后一个参数给出了子网掩码。pcap_compile(fp,&fcode,”tcp”,1,netmask)pcap_setfilter(fp,&fcode)4.设置网络适配器为统计模式if(pcap_setmode(fp,MODE_STAT)0)coutts.t

5、v_sec-old_ts-tv_sec)*1000000-old_ts-tv_usec+header-ts.tv_usec;/获得每秒的比特数 Bps.QuadPart=(*(LONGLONG*)(pkt_data+8)*8*1000000)/(delay);/获得每秒的数据包数Pps.QuadPart=(*(LONGLONG*)(pkt_data)*1000000)/(delay);/将时间戳转变位可读的标准格式ltime=localtime(&header-ts.tv_sec);strftime(timestr,sizeoftimestr,%H:%M:%S,ltime);/Print ti

6、mestampprintf(%s,timestr);/Print the samplesprintf(BPS=%I64u,Bps.QuadPart);printf(PPS=%I64un,Pps.QuadPart);/store current timestampold_ts-tv_sec=header-ts.tv_sec;old_ts-tv_usec=header-ts.tv_usec;运行结果:四、课程设计总结这次的课程设计也使我意识到了理论与实践相结合的重要作用,学习到知识应该应用到实践中。在此次的课程设计过程中,熟悉IP包格式和加深对IP协议的理解,告诉我们要不断地学习网络方面的知识,精

7、益求精,我们应不断地提高自己的水平,在每次的编程中能够有所领悟,让自己在程序的编译和应用上可以有更大一步的提高。更好的学习计算机网络和其他方便的有关知识,做到精益求精。指导教师评语:成绩:指导教师:年月日附录一:程序代码/ NodeList.h: interface for the CNodeList class./#if !defined(AFX_NODELIST_H_9781C411_82DF_47F7_A449_3054B18A550E_INCLUDED_)#define AFX_NODELIST_H_9781C411_82DF_47F7_A449_3054B18A550E_INCLUD

8、ED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000#include#include#include#include#include IPNode.husing namespace std;/ 结点链表类CNodeListclassCNodeListprivate: CIPNode * pHead; / 链表头 CIPNode * pTail; / 链表尾 public: / Default constructor CNodeList(); / Default destructor virtual CNodeList(); / 把新捕获的

9、IP数据包加入链表 voidaddNode(unsigned long, unsigned long, unsigned char); / 输出链表 ostream& print(ostream&);#endif / !defined(AFX_NODELIST_H_9781C411_82DF_47F7_A449_3054B18A550E_INCLUDED_)/ IPNode.h: interface for the CIPNode class./#if !defined(AFX_IPNODE_H_1366A568_424A_4BDF_8E76_9AF5BA10D449_INCLUDED_)#d

10、efine AFX_IPNODE_H_1366A568_424A_4BDF_8E76_9AF5BA10D449_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000/ 结点类CIPNodeclassCIPNodeprivate: unsigned long m_dwSourIPAddr; / 源IP地址 unsigned long m_dwDestIPAddr; / 目的IP地址 unsigned char m_chProtocol; / IP包的协议类型 unsigned long m_dwCouter; / 数据包的数量p

11、ublic: CIPNode * pNext; / 指向下一类IP结点 CIPNode(); virtual CIPNode(); / 构造函数 CIPNode(unsigned long, unsigned long, unsigned char); / 增加数据包的数量 voidaddCount(); / 取得数据包数量 unsigned long getCount(); / 取得源IP地址 unsigned long getSourIPAddr(); / 取得目的IP地址 unsigned long getDestIPAddr(); / 取得协议类型 unsigned char getP

12、rotocol(); / 取得协议名称(TCP,UDP,ICMP.) char * getProtocol_String();#endif / !defined(AFX_IPNODE_H_1366A568_424A_4BDF_8E76_9AF5BA10D449_INCLUDED_)#include#include#include#include#include#include#include#includeusing namespace std;#include IPNode.h#include NodeList.h#pragma comment(lib, Ws2_32.lib)/ 定义IP头

13、部typedefstructIPHeader unsigned char Version_HeaderLength; / 版本(4位)+首部长度(4位) unsigned char TypeOfService; / 服务类型 unsigned short TotalLength; / 总长度 unsigned short Identification; / 标识 unsigned short Flags_FragmentOffset; / 标志(3位)+分片偏移(13位) unsigned char TimeToLive; / 生存时间 unsigned char Protocal; / 协议

14、 unsigned short HeaderChecksum; / 首部校验和 unsigned long SourceAddress; / 源IP地址 unsigned long DestAddress; / 目的IP地址IPHEADER;#include IPMonitor.h#define BURRER_SIZE 65535void main(intargc,char * argv) / 判断输入的命令行格式是否正确 if (argc != 2) cout 请按以下格式输入命令行: IPMonitorduration_time endl 其中duration_time为监控时间, 单位为

15、秒endl; return; WSADATA wsData; / 初始化Winsock DLL if (WSAStartup(MAKEWORD(2,2),&wsData) != 0) cout WSAstartup failed! endl; return; / 创建Raw Socket SOCKET sock; if ( (sock = WSASocket(AF_INET, SOCK_RAW, IPPROTO_IP, NULL, 0, WSA_FLAG_OVERLAPPED) = INVALID_SOCKET ) cout Create socket failed! endl; return

16、; / 设置IP头操作选项,表示用户可以亲自对IP头进行处理 BOOL bFlag = TRUE; if (setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char *)&bFlag, sizeof(bFlag) = SOCKET_ERROR) cout Setsockopt failed! endl; return; / 获取本地主机名 charpHostName128; if (gethostname(pHostName, 100) = SOCKET_ERROR) cout Gethostname failed! endl; return; / 通过本地

17、主机名获取本地IP地址 hostent * pHostIP; if(pHostIP = gethostbyname(pHostName) = NULL) coutGethostbyname failed!h_addr_list0; / 设定IP地址 addr_in.sin_family = AF_INET; / 设定地址类型 addr_in.sin_port = htons(8000); / 设定端口 / 把原始套接字绑定到本机地址上 if(bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in) = SOCKET_ERROR) cout Bind faile

18、d! endl; return; / 把网卡设置为混杂模式,以便接收所有的IP包#define IO_RCVALL _WSAIOW(IOC_VENDOR,1) unsigned long pBufferLen10; unsigned long dwBufferInLen = 1; unsigned long dwBytesReturned = 0; if (WSAIoctl(sock, IO_RCVALL, &dwBufferInLen, sizeof(dwBufferInLen), &pBufferLen, sizeof(pBufferLen), &dwBytesReturned, NULL

19、, NULL) = SOCKET_ERROR) coutIoctlsocket failed!endl; return; / 把socket设置为非阻塞模式 unsigned long dwTemp = 1;ioctlsocket(sock, FIONBIO, &dwTemp); / 设置接收缓冲区 charpBufferBURRER_SIZE; / 定义存放IP数据包的链表 CNodeListIpList; double dwDuration = atof(argv1); / 输入参数为捕获时间 time_t beg; time_t end; time(&beg); / 获得当前系统时间 /

20、 输出本地IP地址 coutendl; cout 本机IP: inet_ntoa(*(in_addr *)&(addr_in.sin_addr.S_un.S_addr) endlendl; cout 开始捕获. endl= dwDuration) break; / 捕获经过网卡的IP数据包 intnPacketSize = recv(sock,pBuffer,BURRER_SIZE,0); if (nPacketSize 0) IPHEADER * pIpHdr; / 通过指针把缓冲区中的内容强制转换为IPHEADER数据结构 pIpHdr = (IPHEADER *)pBuffer; / 判

21、断IP包的源IP地址或目的IP地址是否为本地主机的IP地址 if (pIpHdr-SourceAddress = addr_in.sin_addr.S_un.S_addr | pIpHdr-DestAddress = addr_in.sin_addr.S_un.S_addr) / 如果源IP地址或目的IP地址是本机IP,则将该IP数据包加入链表 IpList.addNode(pIpHdr-SourceAddress, pIpHdr-DestAddress, pIpHdr-Protocal); / 输出统计结果 cout IP数据包统计结果: ( dwDuration 秒)endlendl; IpList.print(cout); coutendl; return;

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2