我是个菜鸟。现在我正在编写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秒内捕获数据包,然后将它们成堆地发送到网络中?我不确定..。
发布于 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版本,以便说明是否可以这样做,以及如何做到。)
https://stackoverflow.com/questions/24988182
复制相似问题