Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 30.04.2017
Сообщений: 9

Работа с указателями и WinPcap

03.05.2017, 20:40. Показов 1213. Ответов 6

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Проблема вот в чём: есть переменная pcap_t*, которая указывает на первый байт куска памяти, куда был помещен файл .pcap после открытия. Я хочу данный трафик обработать и установить на него фильтр, всё успешно. Только вот потом вернуться к изначальному трафику в программе нельзя, ведь на него установлен фильтр и вообще уже обработан loop'ом(функцию обработки скидывать не стал). Вопрос в том, как в функцию(см. readDnsPacket), где собственно этот фильтр устанавливается, закинуть копию трафика, а не оригинал. Необходимо это для того, чтобы далее в программе была возможность работать с оригиналом.
PS: закрыть и открыть заново pcap не предлагать))) простите, что так муторно объясняю!
вот примерный код:
C++
1
2
3
4
5
6
7
8
pcap_t* traffic;
if ((traffic = pcap_open_offline(pathp, nullptr)) == nullptr)
{
        std::cout << "Error open traffic file! \n";
        system("pause");
        return 0;
}
readDnsPacket(traffic);
Функция readDnsPacket:
C++
1
2
3
4
5
6
7
8
inline void readDnsPacket(pcap_t* traffic)
{
    struct bpf_program fp;
    char *str = "udp and src port 53"; //filter for dns-response
    pcap_compile(traffic, &fp, str, 1, 0xffffff);
    pcap_setfilter(traffic, &fp);
    pcap_loop(traffic, 0, PacketHandler, nullptr);
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.05.2017, 20:40
Ответы с готовыми решениями:

Работа с WinPcap
Собрал немного трафика с роутера через wireshark。 Сохранил в файл формата .pcapng。 Далее попытался открыть его в своей программе двумя...

Работа фильтра в WinPcap
Доброго времени суток. Суть проблемы такова: не работает фильтр пакетов с использованием WinPcap. Т.е. программа компилируется..(и...

Работа с библиотекой WinPcap
Здравствуйте! Я использую открытую библиотеку WinPcap (написанную под Win32 платформу) для работы с Ethernet сетью. Функции этой...

6
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
04.05.2017, 05:38
ты же по значению указатель передаёшь, он и так скопируется.
traffic из первого куска кода никуда в другое место указывать не станет.
0
0 / 0 / 0
Регистрация: 30.04.2017
Сообщений: 9
04.05.2017, 15:15  [ТС]
Устанавливая фильтр в функции, меняется кусок памяти, на который указывает traffic в функции, но это тот же указатель из main, а не указатель на кусок памяти, где копия данных, на которые указывает traffic в main.
Я хочу передать такой указатель в функцию, который будет указывать на копию данных.
Потому что если все будет работать так, как я написал, то данные находятся в одном экземпляре и изменяя их в функции, они поменяются везде, и больше первоначальных данных я не увижу.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
05.05.2017, 15:59
скинь минимальный компилируемый код, который иллюстрирует проблему, чтобы я мог проверить.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
05.05.2017, 18:53
Два устройства открывайте.
Либо делайте фильтрацию сами.
0
0 / 0 / 0
Регистрация: 30.04.2017
Сообщений: 9
06.05.2017, 03:44  [ТС]
Вот примерная суть кода:

C++
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
38
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <pcap.h> //естественно, внешняя библиотека должна быть подключена со всеми приблудами
 
void ReadDnsPacket(pcap_t* traffic)
{
    struct bpf_program fp;
    char * packetFilter = "udp and src port 53"; //filter for dns-response
    pcap_compile(traffic, &fp, packetFilter, 1, 0xffffff);
    pcap_setfilter(traffic, &fp);
    //pcap_loop(traffic, 0, функция обработки пакетов, nullptr);
}
void ReadSomethingElse(pcap_t* traffic)
{
    struct bpf_program fp;
    char * packetFilter = "tcp"; //filter for dns-response
    pcap_compile(traffic, &fp, packetFilter, 1, 0xffffff);
    pcap_setfilter(traffic, &fp);
    //pcap_loop(traffic, 0, функция обработки пакетов, nullptr);
}
 
int _tmain(int argc, char* argv[])
{
    char * pathp = "путь к pcap-файлу";
    pcap_t * traffic;
    traffic = pcap_open_offline(pathp, nullptr);
    if ((traffic = pcap_open_offline(pathp, nullptr)) == nullptr)
    {
        std::cout << "Error open traffic file! \n";
        system("pause");
        return 0;
    }
    ReadDnsPacket(traffic);
    ReadSomethingElse(triffic); //по сути хотелось бы, чтобы так работало, но копирование данных тут не происходит, только передача указателя
 
    pcap_close(traffic);
}
Пользуясь случаем хочу спросить по фильтрам, может кто подскажет. Никак не могу понять, как отфильтровать трафик в winpcap по размеру пакета. (в моем случае убрать пакеты, у которых размер не равен заданному) PS: фильтр обманчиво говорит, что успешно поставился, но на деле это не так. PPS: с многими другими фильтрами всё нормально работает, а вот с размером так и не удалось побаловаться.

C++
1
2
3
4
std::string packetFilterStr;
packetFilterStr = " len  != " + sizePacket; //sizePacket заданный
pcap_compile(traffic, &fp, const_cast<char*>(packetFilterStr.c_str()), 1, 0xffffff);
pcap_setfilter(traffic, &fp);
Добавлено через 5 минут
Приходится несколько раз открывать и закрывать, но хотелось бы работать с копиями(я изначально думал, что существует функция типа setfiler, которая возвращает отфильтрованный трафик, а оригинал оставляет нетронутым, но не тут-то было), чтобы была возможность распараллелить программу.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
06.05.2017, 09:16
да, действительно меняет что-то.
как вариант, сначала записывать вообще все пакеты в какой-нибудь вектор, а потом их самому фильтровать.
ну или 2 раза открывать.
что и предлагал Croessmah.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.05.2017, 09:16
Помогаю со студенческими работами здесь

Работа с указателями
Нужно чтобы при каждом попадании &quot;1&quot;, в введенной строке выводилось сообщение на экран. Запускается без ошибок, но после ввода строки...

работа с указателями
Как ПРАВИЛЬНО передать в функцию, массив, используя адресацию? Программа находит в массиве слово и перед ним вставляет какое то слово, то...

работа с указателями
#include &lt;iostream&gt; using namespace std; int main() { char *res=&quot;&quot;; res=&quot;1&quot;; res=&quot;2&quot;; ...

Работа с указателями
Всем здравия. Нужна ваша помощь. Есть задание по С++. К сожалению работала в основном по С# да и с указателями не совсем лажу. Может кто...

Работа с указателями
Здравствуйте! Помогите пожалуйста,не могу разобраться с указателями. Как сделать так,что бы при в воде в edit какого-то текста, а с друого...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru