Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
-13 / 6 / 6
Регистрация: 04.08.2015
Сообщений: 622

Библиотека Jnetpcap и метод приема пакетов

24.03.2017, 17:38. Показов 3152. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Поскольку библиотека jnetpcap это обертка для известной WinPcap то и работа с ней должна быть похожа на работу с WinPcap.
С передачей пакетов нет проблем. Но с приемом непонятка.
Прием для WinPcap был достаточно прост - зпускался поток в который помещалась функция pcap_loop
C++
1
2
3
4
5
DWORD WINAPI Input_thread( LPVOID lpParam )
{
  pcap_loop(adhandle, 0, packet_handler, NULL);
  return 0;
}
Далее весь прием и разбор принятых пакетов производился собственно в packet_handler типа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
{
  // вспомогательные строки
  AnsiString StrTmpPct, StrTmp, StrTmpFft;
  int j, k = 0, t = 16, g = 0;
 
  // очистка проверочной строки мак
  StrMacWt = "";
 
  // запись количества пакетов
  QnMac = pkt_data[14] << 8 | pkt_data[15];
 
    // запись входящего мак
    for(int i=0; i<6; i++)
      StrMacWt += StrTmpPct.sprintf("%.2x", pkt_data[i]);
...
Для jnetpcap пытаюсь применить ту же технологию
1. Помещаю метод pcap.loop в поток где также определяю jpacketHandler
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
...
public class GraphicThread extends Thread {
        
        public GraphicThread () {
        
            Arrays.fill(tc, (byte) 0x00);  
            ByteBuffer btc = ByteBuffer.wrap(tc);  
            PcapPacket pp = new PcapPacket(2000); 
        }
        //Create packet handler which will receive packets
        PcapPacketHandler jpacketHandler = new PcapPacketHandler() {
        Arp arp = new Arp();
        Udp udp = new Udp();
        Tcp tcp = new Tcp();
 
            @Override
            public void nextPacket(PcapPacket pp, Object t) {
                //Here i am capturing the ARP packets only,you can capture any packet that you want by just changing the below if condition
                if (pp.hasHeader(arp)) {
                    System.out.println("Hardware type" + arp.hardwareType());
                    System.out.println("Protocol type" + arp.protocolType());
                    System.out.println("Packet:" + arp.getPacket());
                    System.out.println();
                } else if (pp.hasHeader(tcp)) {       
                    input.add("Packet:" + tcp.getPacket(), adapterList);
 
                }
            }
        };
 
        // переопределение метода run
        @Override
        public void run() {
            
        pcap.loop(10, jpacketHandler, "jnetpcap rocks!");
 
....
После запуска потока появляется ошибка
Java
1
2
3
4
5
Exception in thread "Thread-3" org.jnetpcap.PcapClosedException
    at org.jnetpcap.Pcap.datalink(Native Method)
    at org.jnetpcap.Pcap.datalinkToId(Pcap.java:1143)
    at org.jnetpcap.Pcap.loop(Pcap.java:2689)
    at javaethtest.JavaEthTest$GraphicThread.run(JavaEthTest.java:35)
Если кто сталкивался подскажите пожалуйста как правильно выполнять прием в jnetpcap?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.03.2017, 17:38
Ответы с готовыми решениями:

Нет приема пакетов
помогите разобраться в чем проблема... провели одному человеку сеть 100 мбит локалку, на коннекторах есть 100% контакт, сетевуха тоже...

Написать программу для приема UDP пакетов
Всем доброго времени суток! Мне необходимо написать программу, которая принимала бы udp пакеты от устройства из локальной сети. В качестве...

Система выдачи и приема сотрудникам инструмента (склад инструментов)(аналогия База данных Библиотека)
Здравствуйте,создаю автоматизированную информационную систему &quot;Склад инструментов&quot;.Очень похоже на базу данных библиотеки, но...

4
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
24.03.2017, 21:40
Цитата Сообщение от VlGuvin Посмотреть сообщение
как правильно выполнять прием в jnetpcap?
на сайте примеры есть
0
-13 / 6 / 6
Регистрация: 04.08.2015
Сообщений: 622
26.03.2017, 23:17  [ТС]
Да, примеры есть, но нигде нет примера приема и записи в буфер данных безпротокольнго пакета. В Windows имелась функция которая давала такую возможность:
C++
1
 void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
Как это делается в jnetpcap не понятно, хотя протокольные пакеты принимаются без проблем примерно так
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
   //Create packet handler which will receive packets
    static PcapPacketHandler jpacketHandler = new PcapPacketHandler() {
        Arp arp = new Arp();
        Tcp tcp = new Tcp();
        Udp udp = new Udp();
 
        @Override
        public void nextPacket(PcapPacket packet, Object t) {
            //Here i am capturing the ARP packets only,you can capture any packet that you want by just changing the below if condition
            if (packet.hasHeader(arp)) {
                System.out.println("Packet:" + arp.getPacket());
                System.out.println();
            }
            else if (packet.hasHeader(tcp)) {
                System.out.println("Packet:" + tcp.getPacket());
                System.out.println();
            }
            else if (packet.hasHeader(udp)) {
                System.out.println("Packet:" + udp.getPacket());
                input.setText("Packet:" + udp.getPacket());
                System.out.println();
            }
        }
    };
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
26.03.2017, 23:57
Цитата Сообщение от VlGuvin Посмотреть сообщение
public void nextPacket(PcapPacket packet, Object t) {
насколько я понимаю оно как раз принимает все пакеты, не совсем понимаю вопрос
0
-13 / 6 / 6
Регистрация: 04.08.2015
Сообщений: 622
27.03.2017, 13:32  [ТС]
Вроде да. Должен ловить все имеющиеся пакеты. Сделал так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    PcapPacketHandler<String> jpacketHandler = new PcapPacketHandler<String>() {
        
        String bd, readData;
        byte[] bufrd = new byte [2000];
 
        @Override
        public void nextPacket(PcapPacket packet, String user) {
            byte[] data = packet.getByteArray(0, packet.size()); // the package data
            input.setText("");
            readData = "";
            for (int i = 0; i < data.length; i++){
                bufrd[i] = 0;
                bufrd[i] = data[i];
                readData = readData + String.format("%02X ", bufrd[i]);
            }
            input.setText(readData);
        }
    };
Когда в окне input мелькают данные толком не понять что за данные и когда (в какое время) они пойманы. Поэтому принудительно по нажатию кнопки JButton отсылаю в сеть на выбранный адаптер короткий пакет и в окне input контроллирую отлов пакета. Да, пакет появляется, но с запозданием на 2..3 секунды, в то время как известный сниффер Wireshark срабатывает сразу. Теперь уже не понимаю как работает
Java
1
pcap.loop(NORM_PRIORITY, jpacketHandler, "jnetpcap rocks!");
и каким образом ее нужно запускать. По аналогии с Windows поместил ее в поток и делаю запуск только после выбора адаптера (если pc = true )
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    public class GraphicThread extends Thread {
        
        public GraphicThread () {
        
        }
        
        // переопределение метода run
        @Override
        public void run() {
            while(true)
            {
                try{
                    //Приостанавливает поток на 1 мс
                    sleep(1);       
                    if(pc) {
                        System.out.println("pcap.loop loop");
                        pcap.loop(NORM_PRIORITY, jpacketHandler, "jnetpcap rocks!");
                    }
        }catch(InterruptedException e){}
            }
        }
    }
Не уверен что это правильно... Как правильно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.03.2017, 13:32
Помогаю со студенческими работами здесь

Библиотека для захвата и изменения пакетов
Необходимо разработать приложение для Windows (windows service), своего рода персональный firewall. Есть список сайтов, для которых...

Библиотека для работы (отправка и прием пакетов) с AMF
Нужен компонент или библиотека для работы(отправка и прием пакетов) с AMF, может есть какие хитрости. QenT, ПравилаИзначальное...

Serial port оптимальный метод обработки пакетов
Всем привет. Хочу у Вас спросить совета... Пишу драйвер для общения прибора и ПО встроенного на компьютере. Использую SerialPort вот...

[Qt&PHP] Шифрование пакетов сервер-клиент, посоветуйте пожалуйста метод
Есть кросплатформенный клиент сделанный с помощью библиотеки qt, есть сервер (PHP скрипт), принимающий и обрабатывающий команды,...

Задача передачи пакетов данных: смоделировать процесс обслуживания 5000 пакетов
Господа, добрый вечер. Пожалуйста, помогите с задачей: Система передачи данных обеспечивает передачу пакетов данных из пункта А в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru