c++网络嗅探器?
捕捉到从以太帧,arp包,ip包,icmp包,tcp包,udp包。求解
pcap 库是一个跨平台的网络数据包捕获库,可以用来实现网络嗅探器、流量分析工具等。
下面是一个简单的例子,演示如何使用 pcap 库捕获网络数据包:
#include <pcap.h>
#include <iostream>
using namespace std;
void packet_handler(u_char *user_data, const struct pcap_pkthdr *pkthdr, const u_char *packet)
{
// 输出捕获到的数据包的长度
cout << "Packet length: " << pkthdr->len << endl;
}
int main()
{
char errbuf[PCAP_ERRBUF_SIZE]; // 用于存储错误信息的字符数组
pcap_t *handle; // 捕获句柄
const u_char *packet; // 数据包
struct pcap_pkthdr hdr; // 数据包头
struct bpf_program fp; // 过滤规则
bpf_u_int32 mask; // 子网掩码
bpf_u_int32 net; // 网络地址
// 获取网络接口
if (pcap_findalldevs(&alldevs, errbuf) == -1)
{
cout << "Error in pcap_findalldevs: " << errbuf << endl;
return 1;
}
// 打印所有网络接口信息
for (pcap_if_t *d = alldevs; d; d = d->next)
cout << d->name << ": " << d->description << endl;
// 选择一个网络接口
cout << "Enter the interface number (1-" << num_devs << "): ";
int inum;
cin >> inum;
if (inum < 1 || inum > num_devs)
{
cout << "Interface number out of range." << endl;
return 1;
}
// 跳转到选择的网络接口
for (pcap_if_t *d = alldevs, i = 0; i < inum - 1; d = d->next, i++);
// 获取网络地址和子网掩码
if (pcap_lookupnet(d->name, &net, &mask, errbuf) == -1)
{
cout << "Error in pcap_lookupnet: " << errbuf << endl;
return 1;
}
// 打开选择的网络接口
handle = pcap_open_live(d->name, 65535, 1, 1000, errbuf);
if (!handle)
{
cout << "Error in pcap_open_live: " << errbuf << endl;
return 1;
}
// 设置过滤规则(只捕获 TCP 包)
if (pcap_compile(handle, &fp, "tcp", 0, net) == -1)
{
cout << "Error in pcap_compile: " << pcap_geterr(handle) << endl;
return 1;
}
if (pcap_setfilter(handle, &fp) == -1)
{
cout << "Error in pcap_setfilter: " << pcap_geterr(handle) << endl;
return 1;
}
// 开始捕获数据包
if (pcap_loop(handle, 0, packet_handler, NULL) == -1)
{
cout << "Error in pcap_loop: " << pcap_geterr(handle) << endl;
return 1;
}
// 关闭捕获
pcap_close(handle);
return 0;
}