计算机网络课程设计 解析ip数据包,【图片】求助:计算机网络课程设计捕获IP包流量统计_计算机网络吧_百度贴吧...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

代码是

#include

using namespace std;

#include

#pragma comment(lib,"wpcap.lib")

#pragma comment(lib,"ws2_32.lib")

//IP包头部结构

struct ip_header

{

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; //校验和

DWORD saddr; //源地址

DWORD daddr; //目的地址

unsigned int op_pad; //选项+填充

};

//IP节点类

class IPNode

{

private:

long m_lIPAddress; //IP包的源地址

long m_lCount; //IP包的个数

public:

IPNode *pNext;

//构造函数

IPNode(long sourceIP)

{

m_lIPAddress=sourceIP;

m_lCount=1;

}

//IP包的个数加1

void addCount()

{

m_lCount++;

}

//返回IP包的个数

long getCount()

{

return m_lCount;

}

//返回IP包的源地址

long getIPAddress()

{

return m_lIPAddress;

}

};

//IP节点链表类

class NodeList

{

IPNode *pHead; //链表头

IPNode *pTail; //链表尾

public:

//构造函数

NodeList()

{

pHead=pTail=NULL;

}

//析构函数

~NodeList()

{

if(pHead!=NULL)

{

IPNode *pTemp=pHead;

pHead=pHead->pNext;

delete pTemp;

}

}

//IP节点加入链表

void addNode(long sourceIP)

{

//链表是否为空

if(pHead==NULL)

{

pTail=new IPNode(sourceIP);

pHead=pTail;

pTail->pNext=NULL;

}

else

{

for(IPNode *pTemp=pHead;pTemp;pTemp=pTemp->pNext)

{

//如果链表中存在此IP,IP包的个数加1

if(pTemp->getIPAddress()==sourceIP)

{

pTemp->addCount();

break;

}

}

//如果链表中没有此IP,则加入链表

if(pTemp==NULL)

{

pTail->pNext=new IPNode(sourceIP);

pTail=pTail->pNext;

pTail->pNext=NULL;

}

}

}

//输出IP节点的内容

ostream &print(ostream &out)

{

for(IPNode *pTemp=pHead;pTemp;pTemp=pTemp->pNext)

{

long lTemp=pTemp->getIPAddress();

out<

out<getCount()<

}

return out;

}

};

void main(int argc,char *argv[])

{

//检查输入命令格式

if(argc!=2)

{

cout<

return;

}

//初始化网卡相关参数

double min=atof(argv[1]);

pcap_if_t *alldevs;

pcap_if_t *d,*head=NULL;

pcap_t *fp;

char errbuf[PCAP_ERRBUF_SIZE];

unsigned int netmask;

char packet_filter[]="ip";

struct bpf_program fcode;

struct pcap_pkthdr*header;

const unsigned char *pkt_data;

//获取网卡列表

if(pcap_findalldevs(&alldevs,errbuf)==-1)

{

cout<

return;

}

//列出网卡数目

int i=0;

for(d=alldevs;d;d=d->next)

{

cout<name;

if(d->description)

cout<description<

}

//没有发现网卡

if(i==0)

{

cout<

return;

}

//选择要使用的网卡

cout<

int k;

cin>>k;

if(k<1||k>i)

{

cout<

return;

}

for(d=alldevs,i=1;inext,i++);

head=d;

//以混杂模式打开网卡

if((fp=pcap_open_live(head->name,1000,1,1000,errbuf))==NULL)

{

cout<

pcap_freealldevs(alldevs);

return;

}

//获得子网掩码

if(head->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)

{

cout<

pcap_freealldevs(alldevs);

return;

}

//设置捕获过滤器

if(pcap_setfilter(fp,&fcode)<0)

{

cout<

pcap_freealldevs(alldevs);

return;

}

//统计捕获的IP包

NodeList link;

int res;

time_t beg,end;

time(&beg);

while((res=pcap_next_ex(fp,&header,&pkt_data))>=0)

{

time(&end);

if(end-beg>=min*60)

break;

if(res==0)

continue;

ip_header *ih;

ih=(ip_header *)(pkt_data+14);

link.addNode(ih->saddr);

}

pcap_freealldevs(alldevs);

//显示统计信息

cout<

cout<

link.print(cout);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值