监控IP包流量课程设计任务书.docx
《监控IP包流量课程设计任务书.docx》由会员分享,可在线阅读,更多相关《监控IP包流量课程设计任务书.docx(14页珍藏版)》请在冰豆网上搜索。
监控IP包流量课程设计任务书
学院
信息科学与工程学院
专业
计算机科学与技术
姓名
XXX
学号
题目
监控IP包流量
内容及要求:
编制程序,监控网络,捕获一段时间内网络上的IP数据包,按IP数据包的源地址统计出该源地址在该时间段内发出的IP包的个数,将其写入日志文件或用图形表示出来(建议用图形表示统计结果)。
程序的具体要求如下:
用命令行运行:
IPstatistictimelogfile
其中,IPstatistics是程序名,time是设定的时间间隔(单位为分钟,比如,2表示2分钟);logfile表示统计结果写入的日志文件名(若用图形表示统计结果则可以不选这个参数)
WindowsXp,CodeBlocks10.05
进度安排:
第16周
星期一:
设计任务分析和总体设计
星期二:
软件算法和流程设计
星期三,四,五:
软件编码实现
第17周
周一:
软件总体调试
周二:
软件运行分析
周三:
答辩,验收程序
周四:
答辩,验收程序
周五:
书写课程设计报告,提交
指导教师(签字):
年月日
学院院长(签字):
年月日
课程设计任务书
目录
1题目内容及设计要求1
2总体设计1
2.1总体功能框图1
2.2类的设计说明1
2.3主要算法流程图3
3程序清单及注释3
4运行结果与分析10
5总结12
6参考文献12
1题目内容及设计要求
题目8监控IP包流量
编制程序,监控网络,捕获一段时间内网络上的IP数据包,按IP数据包的源地址统计出该源地址在该时间段内发出的IP包的个数,将其写入日志文件或用图形表示出来(建议用图形表示统计结果)。
程序的具体要求如下:
用命令行运行:
IPstatistictimelogfile
其中,IPstatistics是程序名,time是设定的时间间隔(单位为分钟,比如,2表示2分钟);logfile表示统计结果写入的日志文件名(若用图形表示统计结果则可以不选这个参数)。
2总体设计
2.1总体功能
1.课程设计中的重点及难点
1)程序中会用到Winpcap,Wiinpcap的介绍请参阅附录B.
2)列出网卡列表,让用户进行选择可用的网卡。
3)注意过滤器的使用,只需捕获IP包,别的包都过滤掉。
2.参考算法
1)取得当前网络设备列表(在标准输出上显示,以让用户进行选择)。
2)将用户选择的Ethernet卡以混杂模式打开,以接收到所有的数据包。
3)设置过滤器,此处的过滤器“IP”。
3)捕获IP包并按包的源地址进行统计(用链表结构进行实现)。
2.2类的设计说明
IP包头部结构:
Structip_header
{
unsignedcharver_ihl;//版本号(4位)+头部长度(4位)
unsignedchartos;//服务类型
unsignedshorttlen;//总长度
unsignedshortflag_fo;//标志+片偏移
unsignedcharttl;//生存时间
unsignedcharproto;//协议
unsignedshortcrc;//校验和
DOWORDsaddr;//源地址
DOWORDdaddr;//目的地址
unsignedcharintop_pad;//选项+填充
};
1)选择网卡。
//选择一个Enthernet卡
for(d=alldevs;d;d=d->name)
{If(d->addresses!
=NULL)
{i++;if(head==NULL)head=d;}
}
2)给出网卡列表,让用户选择。
for(d=alldevs;d;d=d->next)//列出网卡列表,让用户进行选择
{cout<<++j<<”:
”<name;
if(d->description)cout<<””<description<}
3)以混杂模式打开网卡。
if((fp=pcap_open_live(head->name,1000,1,1000,erbuff))==NULL)
{cout<<”\nUnabletoopentheadapter.”<pcap_freealldevs(alldevs);return;
}
4)编译过滤器并设置过滤器。
if(pcap_compile(fp,&fcode,packet_filter,1,netmask)<0)
{cout<<”\nUnabletocompilethepacketfilter.Checkthesyntax.\n”<pcap_freealldevs(alldevs);return;
}
5)在给定的时间内循环捕获IP数据包,并将该包的源地址加入链表。
while((res=pcap_next_ex(fp,&fcode))>=0)
{time(&end);//获取系统时间
if(end->beg>=min*60)//计算统计时间
if(res==0)continue;//超时
ip_header*ih;//找到IP头的位置
ih=(ip_header*)(pkt_data+14);//14为Enthernet头的长度
link.addNode(ih->saddr);//将源IP地址加入链表
}
6)输出链表的内容。
2.3主要算法流程图
主要算法流程图如图2-4所示。
图2-4程序流程图
3程序清单及注释
#ifndefIPNODELIST_H_INCLUDED
#defineIPNODELIST_H_INCLUDED
#endif//IPNODELIST_H_INCLUDED
//
(1)程序中使用的链表(以头文件IPNodeList.h的形式给出):
//IP结点类,存放IP包的源IP地址和其发送的数据包个数
classIPNode
{
private:
longm_lIPAddress;//IP地址
longm_lCount;//发送数据包数
public:
IPNode*pNext;//指向下一个IP结点
IPNode(longsourceIP)//构造函数
{
m_lIPAddress=sourceIP;
m_lCount=1;//初始化数据包个数为1
}//数据包个数加1
voidaddCount()
{
m_lCount++;
}//返回数据包个数
longgetCount()
{
returnm_lCount;
}
//返回IP地址
longgetIPAddress()
{
returnm_lIPAddress;
}
};
//结点链表
classNodeList
{
IPNode*pHead;//链表头
IPNode*pTail;//链表尾
public:
NodeList()
{
pHead=pTail=NULL;
}
~NodeList()
{
if(pHead!
=NULL)
{
IPNode*pTemp=pHead;
pHead=pHead->pNext;
deletepTemp;
}
}
//IP结点加入链表
voidaddNode(longsourceIP)
{
if(pHead==NULL)//当链表为空时
{
pTail=newIPNode(sourceIP);
pHead=pTail;
pTail->pNext=NULL;
}
else//不为空时
{
for(IPNode*pTemp=pHead;pTemp;pTemp=pTemp->pNext)
{
//如果链表中存在此IP,发送数据包个数加1
if(pTemp->getIPAddress()==sourceIP)
{
pTemp->addCount();
break;
}
}
//如果链表中没有此IP,则加入链表
if(pTemp==NULL)
{
pTail->pNext=newIPNode(sourceIP);
pTail=pTail->pNext;
pTail->pNext=NULL;
}
}
}
//输出IP结点,即IP地址和其发送的IP包个数
ostream&print(ostream&out)
{
for(IPNode*pTemp=pHead;pTemp;pTemp=pTemp->pNext)
{
longlTemp=pTemp->getIPAddress();
out<out<getCount()<}
returnout;
}
};
//主程序如下:
#include
#include
#include
#include
#include
#include
#include"pcap.h"
#include"IPNodeList.h"
#pragmacomment(lib,"Wpcap.lib")
#pragmacomment(lib,"Ws2_32.lib")
//IP包的头部结构
structip_header
{
unsignedcharver_ihl;//版本号(4位)+头部长度(4位)
unsignedchartos;//服务类型
unsignedshorttlen;//总长度
unsignedshortidentification;//标识
unsignedshortflags_fo;//标志+片偏移
unsignedcharttl;//生存时间
unsignedcharproto;//协议
unsignedshortcrc;//校验和
DWORDsaddr;//源地址
DWORDdaddr;//目的地址
unsignedintop_pad;//选项+填充
};
voidmain(intargc,char*argv[])
{
if(argc!
=3)//判断参数是否正确
{
cout<<"Usage:
IPStatistictimelogfile"<cout<<"Pressanykeytocontinue..."<_getch();
return;
}
doublemin=atof(argv[1]);
pcap_if_t*alldevs;//网络设备结构
pcap_if_t*d,*head=NULL;
pcap_t*fp;//网卡描述
charerrbuf[PCAP_ERRBUF_SIZE];//错误信息
unsignedintnetmask;//子网掩码