我有一个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()
单独打开它们并将一个实例传递给传输线程,将一个实例传递给接收线程。
在我改变大量代码之前,我希望有人能够确认这确实是解决这个问题的正确方法。
提前感谢您的回答。
答案 0 :(得分:0)
您必须以某种方式同步线程之间的访问权限,例如你可以用
从jNetPcap Documentation:然而,只要外部同步访问,就可以安全地与来自多个线程的各种Pcap对象进行交互。