使用 Pcap 进行超时监听

2023-12-06

我想在 Linux 上使用 C 语言的 Libpcap 编写一个小应用程序。

目前,它开始嗅探并等待数据包。但这并不是我真正需要的。我希望它等待 N 秒然后停止监听。

我怎样才能做到这一点?

这是我的代码:

void got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet)
{
       printf("got packet\n);
}

int main()
{
 int ret = 0;
 char *dev = NULL;   /* capture device name */
 char errbuf[PCAP_ERRBUF_SIZE];  /* error buffer */
 pcap_t *handle;    /* packet capture handle */

 char filter_exp[] = "udp dst port 1500";  /* filter expression */
 struct bpf_program fp;   /* compiled filter program (expression) */
 bpf_u_int32 mask;   /* subnet mask */
 bpf_u_int32 net;   /* ip */
 int num_packets = 10;   /* number of packets to capture */


 /* get network number and mask associated with capture device */
 if (pcap_lookupnet(dev, &net, &mask, errbuf) == -1) {
  fprintf(stderr, "Couldn't get netmask for device %s: %s\n",
      dev, errbuf);
  net = 0;
  mask = 0;
 }


 /* print capture info */
 printf("Device: %s\n", dev);
 printf("Number of packets: %d\n", num_packets);
 printf("Filter expression: %s\n", filter_exp);




 /* open capture device */
 handle = pcap_open_live(dev, SNAP_LEN, 1, 1000, errbuf);
 if (handle == NULL) {
  fprintf(stderr, "Couldn't open device %s: %s\n", dev, errbuf);
  exit(EXIT_FAILURE);
 }



 /* compile the filter expression */
 if (pcap_compile(handle, &fp, filter_exp, 0, net) == -1) {
  fprintf(stderr, "Couldn't parse filter %s: %s\n",
      filter_exp, pcap_geterr(handle));
  exit(EXIT_FAILURE);
 }

 /* apply the compiled filter */
 if (pcap_setfilter(handle, &fp) == -1) {
  fprintf(stderr, "Couldn't install filter %s: %s\n",
      filter_exp, pcap_geterr(handle));
  exit(EXIT_FAILURE);
 }

 /* now we can set our callback function */
 pcap_loop(handle, num_packets, got_packet, NULL);

 /* cleanup */
 pcap_freecode(&fp);
 pcap_close(handle);
}

你应该打电话pcap_breakloop()当你想停止聆听时。所以一种方法是:

  • 设置一个警报在 N 秒内触发,
  • 安装信号处理程序SIGALRM信号,
  • call pcap_breakloop()在处理程序内部进行pcap_loop() return.

code:

void alarm_handler(int sig)
{
    pcap_breakloop(handle);
}

int main()
{
    ...

    alarm(N);
    signal(SIGALRM, alarm_handler);

    /* now we can set our callback function */
    pcap_loop(handle, num_packets, got_packet, NULL);

    /* cleanup */
    pcap_freecode(&fp);
    pcap_close(handle);
}

注意:至于使用 libpcap 的读取超时来执行此操作,它不会也不能工作, man pcap 明确警告不要这样做:

读取超时不能用于导致读取数据包的调用在有限的时间内返回[...]这意味着不应使用读取超时,例如,在交互式应用程序中允许数据包捕获循环定期轮询用户输入,因为即使没有数据包到达,也不能保证读取数据包的调用会在超时到期后返回。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Pcap 进行超时监听 的相关文章

随机推荐

  • 不使用 MPMoviePlayer 在 iPhone 上制作动画图像(如电影)的方法

    我需要能够在静态图像上显示动画 鉴于 MPMoviePlayer 无法让您控制任何有用的东西 我认为做到这一点的唯一方法是使用多个静态图像 我们 逐一 显示这些图像以创建 类似电影 的动画 我知道我们可以使用 UIImageView 来做到
  • 仅纵向模式 - iOS

    我有一个应用程序 专为纵向设计 但是我不知道如何限制只使用纵向模式 一旦用户颠倒或横向模式 我不希望我的屏幕方向相应地改变 有什么想法如何去做吗 可以通过重写此方法在应用程序摘要 以及 rootviewcontroller 无论是导航控制器
  • 单位有哪些类型? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 有人知道有什么好的参考资料吗 谢谢 蒂姆 Null 参考类型的底部类型 无 所有类型的底部类型 单位 表示没有结果的类型
  • C 中链表何时使用 NULL,何时使用 '\0'?

    我在 C 中了解到 null char 0 NULL 我在下面编写了一个循环 从 C 中的 char 的开头到结尾进行读取 case 1 char buf 32 while buf i NULL do something 然而 我的 gcc
  • SSE向量化与内存对齐的关系

    为什么 SSE AVX 需要对齐内存 我经常得到的答案之一是对齐的内存加载比未对齐的内存加载快得多 那么 为什么这种对齐的内存加载比未对齐的内存加载快得多呢 这不仅仅是 SSE 甚至 x86 特有的 在大多数架构上 加载和存储需要自然对齐
  • Sql 二进制到 C# - 如何在 C# 中获取与二进制等效的 SQL 二进制

    对你们来说这可能是一个愚蠢的问题 我有一个带有一个二进制列的 SQL 表 它有一些二进制格式的数据 e g 0x9A8B9D9A002020202020202020202020 它的等效英文表示是 test 是否可以转换这个string转化
  • 为什么 Visual Studio 2010 中的架构比较显示差异,而实际上没有差异?

    我本来希望Visual Studio 2010能够对Schema Comparison功能带来一些改进 我怀疑有一些 但我无法让一些基本的工作发挥作用 我从 SQL Server 2005 数据库中获取了一个架构 然后为了确保一切正常 我进
  • 将 android-maps-utils 与 ADT 结合使用

    我正在尝试在 Android 项目中使用这个库 1 并全新安装 ADT 我只是不知道该怎么办 该库似乎使用了一些 VCS 和名为 gradle 的东西 看起来是一个构建工具 有人可以告诉我使用全新安装的 ADT 将该库集成到自己的 Andr
  • 可执行 jar 中 Class.getResource() 和 ClassLoader.getResource() 的奇怪行为

    我的理解是从Class getResource 和 ClassLoader getResource 有什么区别 从自己的代码来看 getClass getResource path image png 与 getClass getClass
  • 使用 xml 映射的 Hibernate 派生属性

    我有一个Detectable类与Revisionsset 它们是 Hibernate 管理的 POJO 我还使用映射我的实体hbm xml文件 当用户转到Detectable管理屏幕 我想让他看到Detectable将数据存入表中 该表还包
  • 有没有办法在设置消费者时定义Azure服务总线规则/过滤器?

    在多租户系统中引入 Azure 服务总线和 MassTransit 时 我正在探索我的选择 基本上 该系统由多项服务组成 其中一些是特定于租户的 而另一些则是共享的 服务在内部保存数据 租户数据是隔离的 每个租户都运行相同的服务集 只是他们
  • 在 SCSS 中循环两个 @each 列表

    在我的 CSS 中 我必须创建引用 头发颜色 和 发型 的类 我写了一个 mixin 来帮助我的 CSS 编写更加高效 mixin hair hair colour hair colour hair background image url
  • CSS 中是否可以定位“无目标”?

    是否有 不存在片段标识符 的 CSS 选择器 相反的是 target 问题是 我正在制作一个文档 其中不同部分是可见的 具体取决于您提供的片段标识符 将其视为精灵文件 仅适用于 HTML 所以看起来像这样 section The first
  • EXCEL VBA 时间值格式(hh:mm am/pm)

    如何设置不带秒的 12 小时制时间值的格式 例如 上午 下午时 分 现在我正在使用Format TimeValue Now hh mm 但它不会显示上午 下午 提前致谢 更改格式字符串以包含以下指示符AM PM 基于VBA 格式函数文档 看
  • 如何在水平条上显示值

    我生成了一个条形图 如何在每个条形上显示条形的值 当前情节 我想要得到什么 My code import os import numpy as np import matplotlib pyplot as plt x u INFO u CU
  • 如何通过 Spring Security 和 LDAP 使用“记住我”身份验证?

    我想使用 Spring Security 的 记住我 和 LDAP 身份验证 LDAP认证配置说明here 我刚刚做了一些微小的改变 您能向我解释一下如何在该配置中添加 记住我 吗 或者 也许您可 以给我一个描述如何操作的示例 谢谢 您实际
  • LINQ to Entities 选择多对多关系中的所有条目

    我有 3 个 MySql 表 Students Classes and StudentsInClasses 实体框架将它们转换为两个实体Student and Class 每个都通过多对多导航属性链接到另一个 例如Student Class
  • 提取两个双引号之间的所有数据

    我正在尝试使用 powershell 正则表达式从 AssemblyInfo cs 文件中提取版本数据 下面的正则表达式是我最好的尝试 但它只能拉动字符串 assembly AssemblyVersion 我已经将这个正则表达式放入几个网络
  • 詹金斯的空手道选项

    我正在尝试运行来自詹金斯的代码 在目标和选项中给出特定标签 但它失败并出现以下错误 您能否验证语法并让我知道如何解决此问题 无法在项目 karate boilerplate 上执行目标 org apache maven plugins ma
  • 使用 Pcap 进行超时监听

    我想在 Linux 上使用 C 语言的 Libpcap 编写一个小应用程序 目前 它开始嗅探并等待数据包 但这并不是我真正需要的 我希望它等待 N 秒然后停止监听 我怎样才能做到这一点 这是我的代码 void got packet u ch