利用 pcap 库和 select 函数实现网络数据包实时捕获

概述

在网络编程中,实时捕获网络数据包是一项常见的任务。这对于网络安全分析、网络流量监控以及网络性能调优等领域都非常重要。在本篇博客中,我们将介绍如何利用 pcap 库和 select 函数实现网络数据包的实时捕获,以及一些相关的技巧和应用场景。

1. 程序示例

下面是一个简单的示例程序,演示了如何使用 pcap 库和 select 函数实现网络数据包的实时捕获:

#include <pcap.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/select.h>int main() {char errbuf[PCAP_ERRBUF_SIZE];// 打开网络设备或 pcap 文件pcap_t *handle = pcap_open_live("eth0", BUFSIZ, 1, 0, errbuf);if (handle == NULL) {fprintf(stderr, "pcap_open_live(): %s\n", errbuf);exit(1);}// 获取可被 select 监控的文件描述符int fd = pcap_get_selectable_fd(handle);if (fd < 0) {fprintf(stderr, "pcap_get_selectable_fd() failed\n");exit(2);}// 使用 select 函数进行监控fd_set fds;while (1) {FD_ZERO(&fds);FD_SET(fd, &fds);if (select(fd + 1, &fds, NULL, NULL, NULL) < 0) {fprintf(stderr, "select() failed\n");break;}if (FD_ISSET(fd, &fds)) {struct pcap_pkthdr header;const u_char *packet = pcap_next(handle, &header);if (packet == NULL) {fprintf(stderr, "pcap_next() failed\n");break;}printf("Packet length: %d\n", header.len);}}// 关闭会话pcap_close(handle);return 0;
}

2. 数据包处理和解析

在实际应用中,我们通常需要对捕获到的数据包进行处理和解析,以提取有用的信息。这可以通过分析数据包的首部来完成,比如以太网帧头部、IP 头部、TCP/UDP 头部等。下面是一个简单的示例,展示了如何解析数据包的源地址和目标地址:

// 解析以太网帧头部
struct ether_header *eth_header = (struct ether_header *) packet;
printf("Source MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",eth_header->ether_shost[0], eth_header->ether_shost[1],eth_header->ether_shost[2], eth_header->ether_shost[3],eth_header->ether_shost[4], eth_header->ether_shost[5]);
printf("Destination MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",eth_header->ether_dhost[0], eth_header->ether_dhost[1],eth_header->ether_dhost[2], eth_header->ether_dhost[3],eth_header->ether_dhost[4], eth_header->ether_dhost[5]);

3. 过滤器的应用

pcap 库提供了强大的过滤器功能,可以根据不同的条件过滤出特定类型或来源/目标地址的数据包。在 pcap_open_live 函数中,我们可以传递过滤器表达式来实现数据包过滤。下面是一个示例,只捕获 ICMP 协议的数据包:

pcap_t *handle = pcap_open_live("eth0", BUFSIZ, 1, 0, errbuf);
if (handle == NULL) {fprintf(stderr, "pcap_open_live(): %s\n", errbuf);exit(1);
}// 设置过滤器
struct bpf_program fp;
char filter_exp[] = "icmp";
if (pcap_compile(handle, &fp, filter_exp, 0, PCAP_NETMASK_UNKNOWN) == -1) {fprintf(stderr, "Couldn't parse filter %s: %s\n", filter_exp, pcap_geterr(handle));exit(1);
}
if (pcap_setfilter(handle, &fp) == -1) {fprintf(stderr, "Couldn't install filter %s: %s\n", filter_exp, pcap_geterr(handle));exit(1);
}

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

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

相关文章

数据结构---时间复杂度+空间复杂度

算法(algorithm)简单说就是解决问题的方法。方法有好坏&#xff0c;同样算法也是&#xff0c;有效率高的算法&#xff0c;也有效率低的算法。衡量算法的好坏一般从时间和空间两个维度衡量&#xff0c;也就是本文要介绍的时间复杂度和空间复杂度。有些时候&#xff0c;时间与空间…

2024年第七届大数据技术国际会议(ICBDT 2024)即将召开!

2024年第七届大数据技术国际会议&#xff08;ICBDT 2024&#xff09;将于2024年9月20-22日在中国杭州的浙江工商大学举行。数据驱动未来&#xff0c;技术引领潮流。从数据挖掘算法的优化&#xff0c;到数据处理速度的提升&#xff0c;再到数据安全与隐私保护的进步&#xff0c;…

求解ab串

【问题描述】 给定一个由字符a和字符b组成的字符串&#xff0c;可以删除若干字符&#xff0c;使得剩下来的字符串满足前后段为a&#xff0c;中间段为b&#xff08;aaa....aaabbbb.....bbbbaaa.....aaa&#xff09;,区段可以没有字符&#xff08;ba,ab,b,aa都是合法的&#xff…

Scikit是什么?

目录 一、Scikit是什么&#xff1f; 二、用Scikit做一个简单房价预测例子 三、sklearn知识点 一、Scikit是什么&#xff1f; Scikit就是scikit-learn&#xff0c;是一个免费软件机器学习库。 https://scikit-learn.org/stable/https://scikit-learn.org/stable/ 用于预测数…

SoundStream: 下一代的神经网络音频编解码器,实时压缩不牺牲音质

音频编解码技术的目标是&#xff0c;通过减少音频文件的大小来节省存储空间或减轻网络传输的负担。理想的情况下&#xff0c;即使音频被压缩&#xff0c;我们听到的声音与原版也应该没有任何区别。 过去&#xff0c;已经有不少编解码技术被开发出来&#xff0c;满足了这些需求…

[重学Python] Day8 面向对象编程:详解基于接口编程、组合优于继承、控制反转及SOLID五个原则

[重学Python] Day8 面向对象编程&#xff1a;详解基于接口编程、组合优于继承、控制反转及SOLID五个原则 一、面向对象编程的理念1、基于接口编程面向对象中基于接口编程主要有以下一些优点和特点 2、组合优于继承组合优于继承的优点和特点主要包括以下几点 3、控制反转通过控制…

Day13-JavaWeb开发-事务管理(回顾/进阶)AOP基础(入门/概念)AOP进阶(通知类型/顺序/切点表达式)AOP案例

1. 事务管理 1.1 事务管理-事务回顾 1.2 事务管理-事务进阶 rollbackFor propagetion 2. AOP基础 2.1 AOP基础-快速入门 2.2 AOP基础-核心概念 3. AOP进阶 3.1 AOP进阶-通知类型 3.2 AOP进阶-通知顺序 3.3 切入点表达式-execution 3.4 切入点表达式-annottation 3.5 AOP进阶…

Flutter路由跳转的两种方式

1.基本路由跳转&#xff1a;文件引入在你要跳转的页面引入 ElevatedButton(onPressed: () {Navigator.of(context).push(MaterialPageRoute(builder: (BuildContext context) {return const NewsPage(arguments: {"title": "基本路由新闻页面传值","a…

Linux中对文件的操作(二)

文件描述符 文件描述符fd是通过open打开某一文件后返回的非负整数。在Linux系统中默认存在的文件描述符有0——标准输入&#xff0c;1——标准输出&#xff0c;2——标准错误 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include &…

如何构建用于从收据中提取信息的生成式人工智能工具

原文地址&#xff1a;how-to-build-a-generative-ai-tool-for-information-extraction-from-receipts 使用 LangChain 和 OpenAI 工具从 Google Drive 中存储的收据图像中提取结构化信息 2024 年 4 月 10 日 纸质收据有各种样式和格式&#xff0c;是自动信息提取的一个有趣目…

Web服务器手动配置

目录 配置环境 http配置 配置步骤 1、首先安装Nginx&#xff08;已经安装的跳过这步&#xff09; 2、查看一下下Nginx的配置文件结构&#xff0c;了解如何配置&#xff0c;以及配置的各个条目有什么作用&#xff08;为接下来的配置打基础&#xff09; 3、创建你的网页 4、…

leetCode79. 单词搜索

leetCode79. 单词搜索 思路&#xff1a;就是在各个位置四个方向的暴力搜索&#xff08;dfs&#xff09;&#xff0c;直到找到word一摸一样的方案为止 代码 /* 此题就是一个从每一个方向向四周暴力搜索的题目 */ class Solution { public:bool exist(vector<vector<char&…

【JAVA项目】基于ssm的协同过滤算法的【图书推荐系统】

技术简介&#xff1a;采用B/S架构、ssm 框架、Java技术、MySQL等技术实现。 系统简介&#xff1a;系统权限按管理员和用户这两类涉及用户划分。&#xff08;1&#xff09;管理员功能需求 管理员登陆后&#xff0c;主要包括首页、个人中心、用户管理、书籍管理、书籍分类管理、热…

牛客NC382 切割木头【中等 二分超找 Java/Go/C++】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/707d98cee255448c838c76918a702be0 核心 二分查找Java代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可…

midjourney简单使用体验

自从我下了controlNet近20G的模型以后&#xff0c;我发现我本地的sd实在跑不动了。 为了能更好的试验一下作图&#xff0c;我只能转战mj。 mj相对于我们来说还算挺友好的&#xff0c;有个梯子就行&#xff0c;虽然需要付费&#xff0c;但是。。多的我也不多说了&#xff0c;懂…

vue如何如何组合组件并通讯

在Vue中&#xff0c;组件的组合和通讯是构建复杂应用的关键部分。Vue提供了多种方式来组合组件&#xff0c;并允许组件之间进行通讯。以下是一些常见的方法&#xff1a; 1. 父子组件通讯 父组件向子组件传递数据&#xff1a; 通过props属性向子组件传递数据。 vue <!--…

安卓 app icon大小 安卓app界面尺寸大小

移动应用的界面设计画布尺寸设计多大&#xff08;特别是Android&#xff09;、图标和字体大小怎么定、需要设计多套设计稿么、如何切图以配合开发的实现&#xff1f; 本篇将结合iOS和android官方的设计规范、搜集的资料以及工作中的摸索&#xff0c;来分享移动应用界面设计中的…

Delta lake with Java--读《Delta Lake Up and Running》总结

利用5.1假期读完《Delta Lake Up and Running》&#xff0c;这本书非常适合入门&#xff0c;但不够深入&#xff0c;要想将Delta lake用于实际项目&#xff0c;还是需要从spark开始重新学习。学完一本书总结一下这本书的内容。 第一章 概念介绍&#xff0c;其中第21页的Medall…

gcc编译器分析

gcc编译器分析 参考词法分析语法分析预读一个符号语法分析函数调用关系重点函数分析c_parse_filec_parser_translation_unit 参考 《gcc源码分析》 词法分析 词法分析的过程就是将源代码识别成一个一个的词法符号&#xff0c;并在词法分析的过程中创建一些树节点&#xff0c…

tomcat+nginx 动静分离

一、单机反向代理 7-1 7-2 测试 二、多机反向代理 1. 环境准备 机器IP地址服务7-1172.168.1.11nginx7-2172.168.1.12tomcat7-3172.168.1.13tomcat 2. 配置7-1 Nginx 服务器 vim /apps/nginx/conf/nginx.confhttp:upstream tomcat {server 172.168.1.12:8080;server …