该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
代码是
#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);
}