网络编程:拆分数据包---libpcap库

使用libpcap对抓到的数据报进行拆分
安装:sudo apt-get install libpcap-dev
1、打开网络设备
获取可用的网络设备名指针

char *pcap_lookupdev(char *errbuf)

打开一个用于捕获数据的网络接口

pcap_t *pcap_open_live(const char *device,int snaplen,int promise,int to_ms,char *ebuf)

捕获一个网络数据

const u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h)

2、设置过滤规则

​ 1)先编译过滤规则

int pcap_compile(pcap_t *p,struct bpf_program *program,char *buf,int optimize,bpf_u_int32 mask)  2

设置过滤规则

int pcap_setfilter(pcap *p, struct bpf_program *fp)

3、捕获数据 【重要】

4、关闭网络设备

void pcap_close(pcap_t *p)

代码示例:

#include <pcap/pcap.h>#include <stdio.h>
#include <stdint.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>int main(int argc, char const *argv[])
{char error[128]="";char *device_name = pcap_lookupdev(error);  // 自动查询网卡设备if(device_name == NULL){printf("error: %s\n", error);return -1;}uint32_t ip, netmask; // 网络ID和子网掩码int n = pcap_lookupnet(device_name,&ip, &netmask,error);if(n == -1){printf("error: %s\n", error);return -1;}uint8_t ip_[INET_ADDRSTRLEN] = "";inet_ntop(AF_INET, &ip, ip_, INET_ADDRSTRLEN);printf("网卡名: %s, %s\n", device_name, ip_);  // 打开网络接口 (混杂模式、打开网络接口可以等待 1s ,可以接收最大1518的数据报)pcap_t *cap = pcap_open_live(device_name, 1518, 0, 0, error);if(cap == NULL){printf("error: %s\n", error);return -1;}// 获取数据报while(1){struct pcap_pkthdr hdr;  // 抓包的时间, 数据长度,实际数据长度(报文长度)const u_char *data = pcap_next(cap, &hdr);// 从data中获取源/目标ip和源/目标端口号// data: 14 mac报文uint16_t type = ntohs( *((uint16_t *)(data + 12))) ; // 获取mac报文的type       if(type == 0x0800){ // 是IP报文uint32_t sip = *((uint32_t *)(data+26));uint32_t dip = *((uint32_t *)(data+30));uint8_t  protocal = *(data+23);  // 14+8+1uint8_t srcip[16]= "", dstip[16]="";inet_ntop(AF_INET, &sip, srcip, 16);inet_ntop(AF_INET, &dip, dstip, 16);if(protocal == 17){const uint8_t *udp_data = data+14+20+8;if(strncmp(udp_data, "hi",2) == 0)printf("%s -> %s protocol(%d): %s\n", srcip, dstip, protocal, data+14+20+8);else if(strncmp(udp_data, "bye",3) == 0) break;}}}pcap_close(cap); // 关闭网络接口return 0;
}

代码示例 2:

#include <pcap/pcap.h>#include <stdio.h>
#include <stdint.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>// 获取数据的回调函数
void capdata_callback(u_char *usrarg, const struct pcap_pkthdr *hdr, const u_char *data){if(hdr->caplen <= 0 || data == NULL) return;printf("datalen : %d ", hdr->caplen);// 获取mac报文中的类型uint16_t type = ntohs(*( (uint16_t *)(data+12) ));printf("\ntype : %x", type);if(type == 0x0800){  // IP 报文// 获取IP报文的协议类型uint8_t protocol = *(data+14+9);printf("\nprotocl : %d\n", protocol);if(protocol == 17){// 获取UDP的端口号uint16_t srcport = ntohs( *(uint16_t *)(data+14+20) );uint16_t dstport = ntohs( *(uint16_t *)(data+14+20+2) );const uint8_t *udp_data = data+14+20+8;printf("udp %d -> %d: %s\n", srcport, dstport, udp_data);}}
}int main(int argc, char const *argv[])
{char error[128]="";char *device_name = pcap_lookupdev(error);  // 自动查询网卡设备if(device_name == NULL){printf("error: %s\n", error);return -1;}// 打开网络接口 (非混杂模式、打开网络接口可以不等待 ,可以接收最大1518的数据报)pcap_t *cap = pcap_open_live(device_name, 1518, 0, 0, error);if(cap == NULL){printf("error: %s\n", error);return -1;}// 获取网络掩码bpf_u_int32 netmask, netip;pcap_lookupnet(device_name, &netip, &netmask, NULL);// 设置过滤条件struct bpf_program program; // bpf的规则程序if(pcap_compile(cap, &program, "host 10.35.184.190 and src port 8000", 0, netmask) != 0){perror("pcap_compile");return -1;}pcap_setfilter(cap, &program);  // 设置bpf过滤规则程序// 获取数据报int n = pcap_loop(cap, 10, capdata_callback, NULL);  // 内部循环获取数据,并调用回调函数将数据传入printf("pcap_loop ->%d \n", n);pcap_close(cap); // 关闭网络接口return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/868606.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue-cli 脚手架详细介绍

4 vue-cli 脚手架 1 脚手架介绍 vue-cli也叫vue脚手架,vue-cli是vue官方提供的一个全局命令工具&#xff0c;这个命令可以帮助我们快速的创建一个vue项目的基础架子。 脚手架&#xff1a;搭建好的一个架子&#xff0c;我们在架子上进行开发 开箱即用零配置基于webpack、webpac…

GEE代码实例教程详解:洪水灾害监测

简介 在本篇博客中&#xff0c;我们将使用Google Earth Engine (GEE) 进行洪水灾害监测。通过分析Sentinel-1雷达数据&#xff0c;我们可以识别特定时间段内的洪水变化情况。 背景知识 Sentinel-1数据集 Sentinel-1是欧洲空间局提供的雷达卫星数据集&#xff0c;它能够提供…

3209. 子数组按位与值为 K 的数目

Powered by:NEFU AB-IN Link 文章目录 3209. 子数组按位与值为 K 的数目题意思路代码 3209. 子数组按位与值为 K 的数目 题意 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回 nums 中有多少个 子数组 满足&#xff1a;子数组中所有元素按位 AND 的结果为 k 。 思…

【Tools】wxapkg是什么格式的文件

我白天是个 搞笑废物 表演不在乎 夜晚变成 忧伤怪物 撕扯着孤独 我曾经是个 感性动物 小心地感触 现在变成 无关人物 &#x1f3b5; 张碧晨/王赫野《何物》 wxapkg 是微信小程序的包文件格式。它是微信小程序的代码和资源打包后的文件&#xff0c;用于发布…

新增多种图表类型,新增插件管理模块,DataEase开源数据可视化分析工具v2.8.0发布

2024年7月8日&#xff0c;人人可用的开源数据可视化分析工具DataEase正式发布v2.8.0版本。 这一版本的功能变动包括&#xff1a;图表方面&#xff0c;新增组合图、热力地图、符号地图、K线图等图表类型&#xff0c;并对已有的仪表盘、明细表、指标卡、富文本等图表类型进行了功…

【已解决】微信小程序报错:request 合法域名校验出错 如若已在管理后台更新域名配置,请刷新项目配置后重新编译项目,操作路径:“详情-域名信息”

场景复现 最近在写微信小程序时&#xff0c;打开开发者工具会出现一下报错&#xff0c;甚至连手机移动端使用时也会出现“网络出错了”这样的错误提示。 解决方法 查看微信官方的文档和网上的一些解决方法&#xff0c;可以按照下面的图文步骤进行设置&#x1f447;&#x1f4…

caeses软件许可优化解决方案

Caeses软件介绍 CAESES是一款十分很不错的三维建模仿真的软件。它功能很大、优化效率高、可以自动化优化、分析工具快速 CAESES拥有多种不同的试验设计及单目标、多目标优化算法&#xff0c;能够根据仿真计算评估的结果。软件可以帮助用户轻松的打造出自各种船舶、汽车、航空航…

Lambda是个什么东西?如何理解和使用?

目录 lambda 的作用 为什么有 lambda 如何使用 lambda 示例 lambda 是 Python 中的一个关键字&#xff0c;用于创建匿名函数&#xff08;也称为 lambda 函数&#xff09;。匿名函数是一种简单的、可以在需要函数对象的地方立即定义的函数。这些函数主要用于定义简单的、一次…

Ai Native应用开发(一)--数字人

背景 刚参加完24年世界人工智能大会&#xff08;WAIC&#xff09;&#xff0c;聊聊自己的一些感受。这次会明显比去年多很多人&#xff0c;用人山人海来形容应该也不为过。根据我自己粗浅观察参会的人员也比去年更多样化。去年更多还是从业者或者是这块研究人员。今年每个论坛…

sql盲注

文章目录 布尔盲注时间盲注 布尔盲注 介绍&#xff1a;在网页只给你两种回显的时候是用&#xff0c;类似于布尔类型的数据&#xff0c;1表示正确&#xff0c;0表示错误。 特点&#xff1a;思路简单&#xff0c;步骤繁琐且麻烦。 核心函数&#xff1a; length()函数substr()函…

day4单向链表

主程序 #include "fun.h" int main(int argc, const char *argv[]) { node_p Lcreate_head();//创建链表 printf("########################链表的头插尾插\n"); insert_head(L,45);//头插 insert_head(L,45); insert_tail(L,45);/…

Go-Zero 框架使用 MongoDB,数据采集入库如此简单

目录 引言 环境准备 如何使用 main入口代码实现 实现采集网络接口 总结 其他资源 引言 Go-Zero 是一个高性能、可扩展的微服务框架&#xff0c;专为 Go 语言设计。它提供了丰富的功能&#xff0c;如 RPC、RESTful API 支持、服务发现、熔断器、限流器等&#xff0c;使开…

PyQt5显示QImage并将QImage转换为PIL图像保存到缓存

PyQt5显示QImage并将QImage转换为PIL图像保存到缓存 1、效果图 2、流程 1、获取摄像头资源,打开摄像头 2、截取图像 3、opencv读的通道是BGR,要转成RGB 4、往显示视频的Label里显示QImage 5、将QImage转换为PIL图像,并保存到缓存 6、获取图像中人脸信息3、代码 # -*- codin…

面试题 04. 二维数组中的查找

二维数组中的查找 题目描述示例:限制&#xff1a; 题解方法一 二分查找 题目描述 在一个 n * m 的二维数组中&#xff0c;每一行都按照从左到右递增的顺序排序&#xff0c;每一列都按照从上到下递增的顺序排序。请完成一个高效的函数&#xff0c;输入这样的一个二维数组和一个…

2024年【安全员-C证】考试及安全员-C证免费试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-C证考试根据新安全员-C证考试大纲要求&#xff0c;安全生产模拟考试一点通将安全员-C证模拟考试试题进行汇编&#xff0c;组成一套安全员-C证全真模拟考试试题&#xff0c;学员可通过安全员-C证免费试题全真模…

【trition-server】pytorch 文档:使用 Triton 提供 Torch-TensorRT 模型

Serving a Torch-TensorRT model with Triton pytorch 的官方文档: Serving a Torch-TensorRT model with Triton 在有关机器学习基础设施的讨论中,优化和部署是密不可分的。一旦完成网络级优化以获得最大性能,下一步就是部署它。 然而,提供这种优化模型也有其自身的一系列…

论文解析——Full Stack Optimization of Transformer Inference: a Survey

作者及发刊详情 摘要 正文 主要工作贡献 这篇文章的贡献主要有两部分&#xff1a; 分析Transformer的特征&#xff0c;调查高效transformer推理的方法通过应用方法学展现一个DNN加速器生成器Gemmini的case研究 1&#xff09;分析和解析Transformer架构的运行时特性和瓶颈…

堆叠的作用

一、为什么要堆叠 传统的园区网络采用设备和链路冗余来保证高可靠性&#xff0c;但其链路利用率低、网络维护成本高&#xff0c;堆叠技术将多台交换机虚拟成一台交换机&#xff0c;达到简化网络部署和降低网络维护工作量的目的。 二、堆叠优势 1、提高可靠性 堆叠系统多台成…

怀庄之醉适合搭配什么食物?

怀庄之醉作为一种独特的佳酿&#xff0c;其丰富的香气和层次感使其能够与多种食物搭配&#xff0c;提升餐饮体验。以下将具体探讨怀庄之醉适合搭配的食物类型&#xff0c;并分析为何这些搭配能够带来卓越的味觉享受。 一、肉类佳肴 怀庄之醉因其浓郁的口感&#xff0c;特别适…

Linux--线程(概念篇)

目录 1.背景知识 再谈地址空间&#xff1a; 关于页表&#xff08;32bit机器上&#xff09; 2.线程的概念和Linux中线程的实现 概念部分&#xff1a; 代码部分&#xff1a; 问题&#xff1a; 3.关于线程的有点与缺点 4.进程VS线程 1.背景知识 再谈地址空间&#xff1a…