Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 21.03.2019, 15:09   #1
NIKITAY
Пользователь
 
Регистрация: 30.01.2016
Сообщений: 34
По умолчанию pcap, чтение пакетов в буфер

Код:
pcap_t * pcap_ds = pcap_open_offline(file.c_str(), errbuf);
я открываю файл
Код:
while (uint32_t res = pcap_next_ex(pcap_ds, &header, &data) >= 0) {
это функция позволяет манипулировать одним пакетом.
А мне надо прочитать все пакеты в буфер, кто может помочь это сделать?
NIKITAY вне форума Ответить с цитированием
Старый 21.03.2019, 15:16   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,095
По умолчанию

Цитата:
Сообщение от NIKITAY Посмотреть сообщение
это функция позволяет манипулировать одним пакетом.
Это функция читает следущий пакет

Цитата:
Сообщение от NIKITAY Посмотреть сообщение
А мне надо прочитать все пакеты в буфер
Ну так двигайте указатель по буферу и вычитывайте пакеты.... только, что вы потом с этим набором данных делать будете?..
Запомните раз и навсегда: помочь != "решите за меня"!
p51x вне форума Ответить с цитированием
Старый 21.03.2019, 15:17   #3
NIKITAY
Пользователь
 
Регистрация: 30.01.2016
Сообщений: 34
По умолчанию

а размер буфера же заранее не известен? откуда я знаю, сколько пакетов в файле
NIKITAY вне форума Ответить с цитированием
Старый 21.03.2019, 15:35   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,095
По умолчанию

ну так читайте, перевыделяйте
Запомните раз и навсегда: помочь != "решите за меня"!
p51x вне форума Ответить с цитированием
Старый 26.03.2019, 01:09   #5
NIKITAY
Пользователь
 
Регистрация: 30.01.2016
Сообщений: 34
По умолчанию

Код:
file.read(sizeChars, 4);

			uint32_t tmp= *(uint32_t*)sizeChars;

			file.read(sizeChars, 4);

			uint32_t* size = (uint32_t*)sizeChars;

                        std::cout<< *size <<std::endl;

			v3.push_back(*size);

			uint32_t p = file.tellg();

			ifile.seekg(p+tmp+8);
не могли бы вы подсказать? решил без использования сторонних библиотек, надо узнать длину файла, по логике все правильно, двигаю указатель на 32 байта(заголовок pcap) и читаю длину пакета, но не выдает результат. Не подскажите почему?
NIKITAY вне форума Ответить с цитированием
Старый 26.03.2019, 04:58   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,095
По умолчанию

Для того, чтобы узнать размер файла не надо так напрягаться, нужен https://en.cppreference.com/w/cpp/filesystem/file_size
Цитата:
Сообщение от NIKITAY Посмотреть сообщение
двигаю указатель на 32 байта(заголовок pcap)
Там же 24: 4 + 2 + 2 + 4 + 4 + 4 + 4

Цитата:
Сообщение от NIKITAY Посмотреть сообщение
читаю длину пакета, но не выдает результат
Вы читаете две части метки времени... почему-то считая это каким=то размером, а потом еще другую метку времени используете для смещения...
Запомните раз и навсегда: помочь != "решите за меня"!

Последний раз редактировалось p51x; 26.03.2019 в 05:09.
p51x вне форума Ответить с цитированием
Старый 26.03.2019, 15:33   #7
NIKITAY
Пользователь
 
Регистрация: 30.01.2016
Сообщений: 34
По умолчанию

ошибся, не длину файла, а длину каждого пакета, ее я и хочу прочитать

Последний раз редактировалось NIKITAY; 26.03.2019 в 16:46.
NIKITAY вне форума Ответить с цитированием
Старый 26.03.2019, 17:50   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 5,970
По умолчанию

Цитата:
Сообщение от NIKITAY Посмотреть сообщение
длину каждого пакета, ее я и хочу прочитать
Смотрите в структуру header, там все.
waleri вне форума Ответить с цитированием
Старый 26.03.2019, 18:57   #9
NIKITAY
Пользователь
 
Регистрация: 30.01.2016
Сообщений: 34
По умолчанию

объясните пожалуйста, где я выложил код выше 24 байта-заголовок pcap, 8 байт- метка времени и микросекунды, далее считываю следующие 4 байта-длина
NIKITAY вне форума Ответить с цитированием
Старый 26.03.2019, 19:07   #10
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,095
По умолчанию

И где вы это делаете?

Цитата:
Сообщение от NIKITAY Посмотреть сообщение
двигаю указатель на 32 байта(заголовок pcap)
Так 32 или 24?

Цитата:
Сообщение от NIKITAY Посмотреть сообщение
8 байт- метка времени и микросекунды, далее считываю следующие 4 байта-длина
Код:
file.read(sizeChars, 4);

			uint32_t tmp= *(uint32_t*)sizeChars;

			file.read(sizeChars, 4);

			uint32_t* size = (uint32_t*)sizeChars;

                        std::cout<< *size <<std::endl;

			v3.push_back(*size);

			uint32_t p = file.tellg();

			ifile.seekg(p+tmp+8);
Что из этих сайзов метки времени и что размер пакеты? Если вы это читаете после заголовка, то tmp - первая метка времени, size - указатель на вторую, p - текущее положение в файловом потоке, т.е. перед длиной. Далее вы устанавливаете положение p+tmp+8 = текущее положение + метка_времени + 8.
Запомните раз и навсегда: помочь != "решите за меня"!
p51x вне форума Ответить с цитированием
Ответ
Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Считать данные с *.pcap файла grafjoker Фриланс 0 26.02.2012 00:17
Увидеть все пакеты в сети. pcap masterbloger C/C++ Сетевое программирование 3 25.03.2011 11:24
Запись во временный буфер, фреймы, подпись пакетов ImmortalAlexSan Работа с сетью в Delphi 49 27.11.2010 17:09
Перехват и чтение содержимого пакетов Ga-sergey Работа с сетью в Delphi 11 26.07.2010 14:39
Получение и чтение входящих UDP пакетов XAOC-forever Работа с сетью в Delphi 6 03.06.2008 10:02