代码拉取完成,页面将自动刷新
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pfring.h>
#include <arpa/inet.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
// #include <unistd.h>
void packet_handler(const struct pfring_pkthdr *header, const u_char *packet) {
struct ip *ip_header = (struct ip *)(packet + 14); // 以太网帧
printf("捕获到数据包: 长度 %u 字节\n", header->len);
// 检查是否为 IPv4 数据包
if (ip_header->ip_v == 4) {
// 测试:只处理 TCP 包
if (ip_header->ip_p == IPPROTO_TCP) {
char src_ip[INET_ADDRSTRLEN];
char dst_ip[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &(ip_header->ip_src), src_ip, INET_ADDRSTRLEN);
inet_ntop(AF_INET, &(ip_header->ip_dst), dst_ip, INET_ADDRSTRLEN);
printf("源 IP 地址: %s\n", src_ip);
printf("目标 IP 地址: %s\n", dst_ip);
struct tcphdr *tcp_header = (struct tcphdr *)(packet + 14 + (ip_header->ip_hl * 4));
printf("协议: TCP\n");
printf("源端口: %u\n", ntohs(tcp_header->source));
printf("目标端口: %u\n", ntohs(tcp_header->dest));
printf("----------\n");
}
} else {
printf("不是 IPv4 数据包\n");
}
}
// 简单测试pf_ring抓包
int main(int argc, char *argv[]) {
if (argc != 3 || strcmp(argv[1], "-i") != 0) {
fprintf(stderr, "用法: %s -i <网口名称>\n", argv[0]);
return -1;
}
char *device = argv[2]; // 获取网口名称
int snaplen = 1500;
int promiscuous = 1;
int rc;
pfring *ring = pfring_open(device, snaplen, promiscuous);
if (ring == NULL) {
fprintf(stderr, "打开设备 %s 时出错\n", device);
return -1;
}
pfring_set_application_name(ring, "SimplePF_RINGPacketSniffer");
pfring_set_direction(ring, rx_and_tx_direction); // 设置抓取接收和发送的数据包
rc = pfring_enable_ring(ring);
if (rc != 0) {
fprintf(stderr, "启用 ring 时出错\n");
pfring_close(ring);
return -1;
}
struct pfring_pkthdr header;
u_char *packet;
while (1) {
if (pfring_recv(ring, &packet, 0, &header, 1) > 0) {
packet_handler(&header, packet);
}
}
pfring_close(ring);
return 0;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。