使用jNetPcap发送和接收以太网帧时的线程安全性

时间:2014-06-24 10:46:08

标签: java multithreading thread-safety libpcap

我有一个Java项目,我需要发送和接收只有以太网头的网络数据包。标头也包含自定义MAC地址,与接收/发送接口的物理硬件地址不匹配。

我已选择jNetPcap 1.3来完成此任务,但我担心Java应用程序的线程安全性,并且需要对libpcap的特性提供一些帮助。

我有两个主题,第一个主题执行

org.jnetpcap.Pcap.loop(Pcap.LOOP_INFINITE, handler, outputQueue)

循环以从调用者传递给线程的先前打开的org.jnetpcap.Pcap对象(表示pcap_t)中捕获数据包。

第二个帖子应该从输入队列中选择有效负载/标头对并使用

发送它们
org.jnetpcap.Pcap.sendPacket(packetByteBuffer)

使用 SAME org.jnetpcap.Pcap对象作为执行接收循环的线程。


问题:

从使用谷歌我得出结论,这种方法不起作用,因为libpcap在从不同线程访问相同的pcap_t对象时不是线程安全的。

理论解决方案:

我认为我的问题的解决方案是创建两个单独的org.jnetpcap.Pcap实例,使用org.jnetpcap.Pcap.openLive()单独打开它们并将一个实例传递给传输线程,将一个实例传递给接收线程。

在我改变大量代码之前,我希望有人能够确认这确实是解决这个问题的正确方法。

提前感谢您的回答。

1 个答案:

答案 0 :(得分:0)

您必须以某种方式同步线程之间的访问权限,例如你可以用

jNetPcap Documentation然而,只要外部同步访问,就可以安全地与来自多个线程的各种Pcap对象进行交互。