我有两个线程,每个线程同时从相同的偏差数据包捕获,但当第二个线程到达pcap_compile()
函数时,程序崩溃。另外每个线程都有自己的变量,并且不使用全局变量。看起来他们得到了相同的设备句柄,因此程序崩溃了。为什么我需要两个线程?因为我想单独发送和接收指定的pcap
过滤器上的数据包。那么我该如何解决这个问题?或者使用一个线程并使用tcp
头中的地址手动对发送和接收的数据包进行排序,会更好吗?两个pcap_compile()在同一个设备上?
1
A
回答
1
pcap_compile是不是线程安全。您必须围绕所有对可能由独立线程使用临界区/互斥体遇到的调用进行调用,以防止因编译表达式的解析器中的非线程安全状态而导致的错误(对于血腥细节,它使用YACC创建代码解析表达式和为此生成的代码显然不是线程安全的)。
如果你在多个线程中重复使用相同的设备句柄,那么你需要为每个线程明确地打开一个设备,这个线程就是你不需要的。你应该在你打算使用它的线程中打开pcap句柄,因此每个计划进行捕获的线程都应该自己做pcap_open
。
看守调用pcap_compile
一个关键部分,你可以创建一个简单的包装(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);
}
相关问题
- 1. 在同一个设备上安装同一个应用的两个版本
- 2. Xcode - 在一个设备上测试两个不同版本的项目
- 3. 两个中心,一个外围设备
- 4. 设备令牌从一个设备到另一个设备是不同的
- 5. Arduino - 同时管理两个SPI设备
- 6. 火力点 - 两个设备应在同一时间
- 7. 在同一个DC上的两个Keyspace
- 8. 两个不同设备上的两个应用程序之间的Android通信
- 9. 在两个不同的设备上与NSDateFormatter不一致的行为
- 10. 在同一时间在多个设备上运行方法 - Android
- 11. 同一个应用程序在同一设备上的不同行为
- 12. 一次用libpcap监听两个设备
- 13. 建设两个版本相同的Android应用程序和同一设备
- 14. opencl中同一设备上的多个上下文
- 15. phonegap ipad/iphone,在两个设备上都有一个应用程序
- 16. 在同一行上的两个TextViews
- 17. 在同一屏幕上的两个tableviews
- 18. 两台电脑在同一个IP上?
- 19. 在同一页上的两个Flexsliders CSS
- 20. 在不同设备上显示不同设备上的NSDate
- 21. 如何发送通知从一个Android设备到另一个Android设备在同一个WiFi网络
- 22. 在同一行上的父母同一行上的两个div
- 23. iOS Deeplink在一个设备上工作,但在其他设备上不工作
- 24. 在两个不同设备(不同屏幕密度)上的相同图像上绘制相同的圆形
- 25. 如何在中间设置同一行上的两个块?
- 26. Bootstrap 5个元素,在不同设备上的不同配置
- 27. 从一个设备到另一个设备的表面上的StretchRectangle
- 28. 在两个图中设置两个不同的yRange在一个图中
- 29. 一个Direct3D设备
- 30. 相同的关键字两个广告组不同的设备