Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> принять raw пакеты 
:(
    Опции темы
boriska98
Дата 21.1.2013, 05:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 28.12.2012

Репутация: нет
Всего: нет



всем привет!
По ethernet сети приходят пакеты (raw), поток примерно 400 кБайт/с. Требуется осуществить их прием и обработку.
Кто знает как добиться МИНИМУМА загрузки CPU и потерь пакетов.

p.s. libpcap не подходит, т.к. сильно грузит процессор

Это сообщение отредактировал(а) boriska98 - 21.1.2013, 08:24
PM MAIL   Вверх
feodorv
Дата 21.1.2013, 09:28 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 10
Всего: 45



Цитата(boriska98 @  21.1.2013,  06:56 Найти цитируемый пост)
По ethernet сети

Вам нужны пакеты прямо с ethernet-заголовком? Если просто IP, то можно попробовать перевести интерфейс в promiscuous mode с помощью опции SIO_RCVALL (напримернапример).


Это сообщение отредактировал(а) feodorv - 21.1.2013, 09:50


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
boriska98
Дата 21.1.2013, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 28.12.2012

Репутация: нет
Всего: нет



Цитата(feodorv @ 21.1.2013,  09:28)
Цитата(boriska98 @  21.1.2013,  06:56 Найти цитируемый пост)
По ethernet сети

Вам нужны пакеты прямо с ethernet-заголовком? Если просто IP, то можно попробовать перевести интерфейс в promiscuous mode с помощью опции SIO_RCVALL (напримернапример).

так и делается. я не точно выразился: не то, чтобы pcap грузит процессор, но много процессорного времени тратится вхолостую.
вот пример реализации:

Код

char *dev, errbuf[PCAP_ERRBUF_SIZE];
struct pcap_pkthdr header;
uchar *packet;
void thread1::initpcap()
{
//инциализация pcap
  dev = pcap_lookupdev(errbuf); 
  handle = pcap_open_live(dev, BUFSIZ, 0, -1, errbuf);
}
void thread1::run() // функция потока-наследника QThread
{
       while(1)  //непрерывно считываем данные
           {
                 packet=pcap_next(handle,&header);
                 // приняли пакет, далее собираем и все
           }

}


PM MAIL   Вверх
feodorv
Дата 21.1.2013, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 10
Всего: 45



Цитата(boriska98 @  21.1.2013,  11:33 Найти цитируемый пост)
много процессорного времени тратится вхолостую

В каком смысле?

Добавлено через 2 минуты и 39 секунд
Я, честно говоря, плохо знаком с библиотекой libpcap, но, вроде, вызов
Цитата(boriska98 @  21.1.2013,  11:33 Найти цитируемый пост)
pcap_open_live(dev, BUFSIZ, 0, -1, errbuf);

не должен переводить интерфейс в promiscuous mode...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
boriska98
Дата 21.1.2013, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 28.12.2012

Репутация: нет
Всего: нет



Цитата(feodorv @  21.1.2013,  11:18 Найти цитируемый пост)
В каком смысле?

я не понимаю как libpcap узнает, что пришла новая порция данных? кто-то уведомляет об этом событии либо устройство тупо периодически опрашивается?
PM MAIL   Вверх
feodorv
Дата 21.1.2013, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 10
Всего: 45



Цитата(boriska98 @  21.1.2013,  13:19 Найти цитируемый пост)
я не понимаю как libpcap узнает

Насколько я знаю, в систему устанавливается специальный драйвер, и вся работа libpcap идёт через этот драйвер.

Цитата(boriska98 @  21.1.2013,  13:19 Найти цитируемый пост)
кто-то уведомляет об этом событии либо устройство тупо периодически опрашивается? 

В принципе, должно уведомляться. А что, pcap_next периодически возвращает NULL?



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
fish9370
Дата 17.2.2013, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: нет
Всего: 1



Цитата(boriska98 @  21.1.2013,  12:19 Найти цитируемый пост)
я не понимаю как libpcap узнает, что пришла новая порция данных? кто-то уведомляет об этом событии либо устройство тупо периодически опрашивается?


прежде всего нужно понимать, где работает эта библиотека (kernel mode/user mode).. так как она работатет в user mode, она физически не может опрашивать оборудование, это и не эффективно..

все происходит примерно так: 
- сетевой адаптер получает порцию данных записывает ее в один из доступных буферов..
- сигнализирует микропроцессору с помощью механизма прерываний, о том что произошло событие..
- микропроцессор замораживает выполнение текущего процесса (в случае если прерывания не были запрещены) и передает управление на соответствующий обработчик прерывания, установленный операционной системой..
- обработчик выполняет копирование данных в user mode и информирует другие подсистемы о том, что пришли данные

- одной из таких заинтересованных подсистем оказывается libbpcap, вот тут он и вступает в игру


если осуществлять фильтрацию пакетов (и возможно другие действия) на уровне ядра, до какого либо копирования, то можно выиграть в производительности подсистемы.. так работает iptables..

если задача стоит в выигрыше производительности, то такой механизм существует (но сейчас не помню как это все называется, если будут заинтересованные - найду и укажу источник)


--------------------
undefined
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0811 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.