Потокобезопасность при использовании jNetPcap для отправки и получения кадров Ethernet

#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 к необработанным сокетам.