首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >第三台计算机在dst计算机从src计算机接收数据包之前使用libpcap捕获、修改和注入数据包。

第三台计算机在dst计算机从src计算机接收数据包之前使用libpcap捕获、修改和注入数据包。
EN

Stack Overflow用户
提问于 2014-07-28 03:51:11
回答 1查看 306关注 0票数 0

我是个菜鸟。现在我正在编写C程序,用于捕获、修改和注入数据包。我有三台计算机: A,B,C。A正在向间隔10 ms的B发送ENIP数据包。C是捕获A发送的数据包并通过以下方式修改数据包: 1)将seq位增量1;2)更改有效载荷。例如,A发送带有seq =1.c的数据包,捕获该数据包,将其seq位更改为2,更改有效负载并将其注入网络。我希望B计算机能在收到由A发送的seq =2的数据包之前收到C发送的这个数据包。

我的c程序使用pcap_loop捕获数据包,使用pcap_inject注入数据包。这个过程只需几微秒。但是,B在接收B发送的数据包之前不能接收C发送的数据包,我在计算机B上观察到B接收A发送的几个数据包(例如seq = 1,2,3,...30),然后B接收C发送的多个数据包(seq = 2,3,4,...,31),然后由A发送的数据包(seq = 31,32,...90),然后由C发送的数据包( seq = 32,...91).

如果我把A的间隔改为1秒,这个问题就不存在了.

我在想,也许pcap_loop有一些中断时间?也许pcap_loop能在0.5秒内捕获数据包,然后将它们成堆地发送到网络中?我不确定..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-28 08:53:36

在几个OSes上,libpcap使用的数据包捕获机制进行“批处理”。它不是在到达时传递每个数据包,而是收集数据包,直到内核中的数据包缓冲区填满或计时器过期为止,此时它会交付整个数据包缓冲区,从而减少上下文切换和系统调用。

这意味着在数据包到达和它的传递到pcap_loop()之间会出现延迟;这对于数据包捕获(特别是大容量数据包捕获,其中批处理可以减少捕获的CPU开销,从而降低丢包的可能性)来说是可以的,但是对于“实时”应用程序来说,这是不行的,因为应用程序希望在数据包到达时立即看到它。

在较新版本的libpcap上,有一个pcap_set_immediate_mode()调用;如果使用pcap_create()pcap_activate()而不是pcap_open_live(),并通过调用pcap_t上的pcap_set_immediate_mode()来设置“立即模式”,在pcap_create()pcap_activate()调用之间调用第二个参数为1,就不会进行缓冲--数据包一到达就会被传递。

在较早版本的libpcap上,您可以将超时设置为非常小的值(1毫秒),或者在某些平台上以依赖于平台的方式设置“即时模式”。(我们需要知道您正在使用的操作系统以及您正在使用的libpcap版本,以便说明是否可以这样做,以及如何做到。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24988182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档