- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写相当简单的pcap“实时”捕获引擎,但是pcap_dispatch的数据包处理回调实现应花费相对较长的时间进行处理。
pcap是否在单独的线程中运行每个“pcap_handler”回调?如果是,“pcap_handler”是否是线程安全的,还是应该使用关键部分来保护它?
另外,pcap_dispatch回调是否可以串行方式工作?例如。仅在完成数据包1的“pcap_handler”之后才调用数据包2的“pcap_handler”吗?如果是这样,是否有一种避免累积延迟的方法?
谢谢,
-V
最佳答案
Pcap基本上是这样工作的:有一个内核模式驱动程序,用于捕获数据包并将它们放置在大小为B的缓冲区中。用户模式应用程序可以随时使用pcap_loop
,pcap_dispatch
或pcap_next
(后者基本上是带有一个数据包的pcap_dispatch
)。
因此,当您使用pcap_dispatch
请求一些数据包时,libpcap进入内核并请求缓冲区中的下一个数据包(如果没有一个超时代码,则填充内容,但这与本讨论无关),进行传输将其放入用户区,然后将其从缓冲区中删除。之后,pcap_dispatch
调用您的处理程序,减少它的待办事项计数器,并从头开始。结果,pcap_dispatch
仅在请求的数据包数量已处理,发生错误或发生超时时返回。
如您所见,与大多数C API一样,libpcap完全是非线程的。但是,内核模式驱动程序显然很乐意将数据包传递到多个线程(否则您将无法从多个进程中捕获),并且完全是线程安全的(每个用户模式都有一个单独的缓冲区)处理)。
这意味着您必须自己实现所有并行性。您想做这样的事情:
pcap_dispatch(P, count, handler, data);
.
.
.
struct pcap_work_item {
struct pcap_pkthdr header;
u_char data[];
};
void handler(u_char *user, struct pcap_pkthdr *header, u_char *data)
{
struct pcap_work_item *item = malloc(sizeof(pcap_pkthdr) + header->caplen);
item->header = *header;
memcpy(item->data, data, header->caplen);
queue_work_item(item);
}
header
和
data
指针无效。
queue_work_item
应该找到一个工作线程,并为其分配处理数据包的任务。由于您说回调需要“相对较长的时间”,因此您可能需要大量的工作线程。找合适数量的 worker 需要精打细算。
snaplen
的
pcap_open_live
参数仅控制捕获一个数据包的多少字节,但是,不能以可移植的方式控制数据包的
数字。它可能是固定大小的。随着越来越多的数据包到达,它可能会变得更大。但是,如果溢出,则所有其他数据包都将被丢弃,直到有足够的空间可容纳下一个数据包为止。如果要在高流量环境中使用应用程序,则要确保* pcap_dispatch *回调快速完成。我的示例回调仅将数据包分配给工作人员,因此即使在交通繁忙的环境中也能正常工作。
关于libpcap - pcap_dispatch-回调处理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7771963/
我正在编写相当简单的pcap“实时”捕获引擎,但是pcap_dispatch的数据包处理回调实现应花费相对较长的时间进行处理。 pcap是否在单独的线程中运行每个“pcap_handler”回调?如果
int pcap_dispatch(pcap_t *p, int cnt, pcap_handler callback, u_char *user) 我知道 pcap_dispatch 在收到数据包时
pcap_loop 和 pcap_dispatch 到底有什么区别? 最佳答案 手册很好地描述了这一点(我是板着脸说的,保证)。来自 man pcap_loop : pcap_loop() pr
为什么pcap_dispatch(count=10)只返回1个数据包? 如果我不执行任何操作,它会等待,然后显示 1 个数据包,但如果我单击链接,它会立即停止并显示 1 个数据包。 我是否应该有这样的
我使用 libpcap 捕获大量数据包,然后处理/修改这些数据包并将它们发送到另一台主机。 首先,我创建一个 libpcap 处理程序 handle并将其设置为非阻塞,并使用 pcap_get_sel
我用 Google 搜索了很多,但我不知道 user 参数是什么用于 pcap_loop()。我在网上找到的最好的一个来自斯坦福大学(链接:http://yuba.stanford.edu/~casa
如果您使用阻塞式 pcap_loop() 或 pcap_dispatch() 通过合适的回调 fn 处理传入的数据包数据,您可能需要中断这些函数,即让他们返回。 现在 pcap_breakloop()
我只是想在 dev.str() 接口(interface)上捕获数据包并将其存储在一个文件中,该文件稍后可用于分析。 案例 1:pcap_loop- 当我使用 pcap_loop 时,它调用 pcap
我正在构建一个网络嗅探器,它将在 PFSense 上运行以监控 IPsec VPN。我在 FreeBSD 8.4 下编译。 我选择使用 C 语言的 libpcap 作为数据包捕获引擎,使用 Redis
我是一名优秀的程序员,十分优秀!