gpt4 book ai didi

c++ - 一台设备上同时有两个 pcap_compile()?

转载 作者:行者123 更新时间:2023-11-30 03:58:50 25 4
gpt4 key购买 nike

我有两个线程,每个线程同时从同一台设备捕获数据包,但是当第二个线程到达 pcap_compile() 函数时程序崩溃。此外,每个线程都有自己的变量,不使用全局变量。似乎他们获得了相同的设备句柄,因此程序崩溃了。为什么我需要两个线程?因为我想通过指定的 pcap 过滤器将发送的数据包和接收的数据包分开。那么我该如何解决呢?还是使用一个线程并使用 tcp header 中的地址手动对发送和接收的数据包进行排序更好?

最佳答案

pcap_compile 不是线程安全的。您必须用关键部分/互斥锁包围单独线程可能遇到的所有对它的调用,以防止由于编译表达式的解析器中的非线程安全状态而导致的错误(对于血淋淋的细节,它使用 YACC 创建代码解析表达式和为此生成的代码显然不是线程安全的)。

您需要为计划用于捕获的每个线程显式打开一次设备,如果您在多个线程中重复使用相同的设备句柄,那么它根本不会执行您要求的操作。您应该在计划使用它的线程中打开 pcap 句柄,因此计划进行捕获的每个线程都应该执行它自己的 pcap_open

为了使用临界区保护对 pcap_compile 的调用,您可以创建一个简单的包装器(Windows 临界区的 C++ 包装器):

class lock_interface {
public:
virtual void lock() = 0;
virtual void unlock() = 0;
};

class cs : public lock_interface {
CRITICAL_SECTION crit;
public:
cs() { InitializeCriticalSection(&crit); }
~cs() { DeleteCriticalSection(&crit); }
virtual void lock() {
EnterCriticalSection(&crit);
}
virtual void unlock() {
LeaveCriticalSection(&crit);
}
private:
cs(const locker &);
cs &operator=(const cs &);
};

class locker {
lock_interface &m_ref;
public:
locker(lock_interface &ref) : m_ref(ref) { m_ref.lock(); }
~locker() { m_ref.unlock(); }
private:
locker(const locker &);
locker &operator=(const locker &);
};

static cs section;

int
wrapped_pcap_compile(pcap_t *p, struct bpf_program *fp, const char *str, int optimize, bpf_u_int32 netmask)
{
locker locked(section);
pcap_compile(p, fp, str, optimize, netmask);
}

关于c++ - 一台设备上同时有两个 pcap_compile()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27245749/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com