Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2019, 14: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, 14:16   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

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

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

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

ну так читайте, перевыделяйте
p51x на форуме Ответить с цитированием
Старый 26.03.2019, 00: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, 03:58   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Для того, чтобы узнать размер файла не надо так напрягаться, нужен 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 в 04:09.
p51x на форуме Ответить с цитированием
Старый 26.03.2019, 14:33   #7
NIKITAY
Пользователь
 
Регистрация: 30.01.2016
Сообщений: 34
По умолчанию

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

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

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

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

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

Цитата:
Сообщение от 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 на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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