#java #multithreading #thread-safety #libpcap
#java #многопоточность #безопасность потоков #libpcap
Вопрос:
У меня есть проект Java, в котором мне требуется отправлять и получать сетевые пакеты только с присутствующим заголовком Ethernet. Заголовок также содержит пользовательские MAC-адреса, которые не соответствуют физическому аппаратному адресу интерфейса приема / отправки.
Я выбрал jNetPcap 1.3 для выполнения этой задачи, но я обеспокоен безопасностью потоков моего Java-приложения и нуждаюсь в некоторой помощи с особенностями libpcap
.
У меня есть два потока, где первый поток выполняет
org.jnetpcap.Pcap.loop(Pcap.LOOP_INFINITE, handler, outputQueue)
цикл для захвата пакетов из ранее открытого org.jnetpcap.Pcap
объекта (представляющего a pcap_t
), переданного потоку вызывающим объектом.
Предполагается, что второй поток выбирает пары полезная нагрузка / заголовок из входной очереди и отправляет их с помощью
org.jnetpcap.Pcap.sendPacket(packetByteBuffer)
использование ТОГО ЖЕ org.jnetpcap.Pcap
объекта, что и поток, выполняющий цикл приема.
Проблема:
Из использования Google я пришел к выводу, что этот подход не работает, потому libpcap
что не является потокобезопасным при доступе к одному и тому же pcap_t
объекту из разных потоков.
Теоретическое решение:
Я думаю, что решение моей проблемы состоит в том, чтобы создать два отдельных экземпляра org.jnetpcap.Pcap
, открыть их отдельно, используя org.jnetpcap.Pcap.openLive()
и передавая один экземпляр в поток передачи и один в поток приема.
Прежде чем я начну менять много кода, я надеюсь, что кто-нибудь сможет подтвердить, что это действительно правильный подход к решению этой проблемы.
Заранее спасибо за ваши ответы.
Ответ №1:
Вы должны каким-то образом синхронизировать доступ между потоками, например, вы могли бы использовать
- Pcap.breakloop() и прерывает цикл, который получает пакеты, чтобы отправить некоторые и продолжить цикл после этого.
- Pcap.dispatch() и короткое время ожидания для Pcap.openLive() и переключение между пакетами в очереди для отправки и получения пакетов.
Из документации jNetPcap: однако безопасно взаимодействовать с различными объектами Pcap из нескольких потоков, если доступ синхронизирован извне.
Комментарии:
1. Спасибо за разъяснение. Я полностью пропустил эту часть документации. Возможно, я вернусь к jNetPcap, поскольку на данный момент я решил создать свою собственную библиотеку с доступом JNI к необработанным сокетам.