принять raw пакеты

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

p.s. libpcap не подходит, т.к. сильно грузит процессор
Kommentare (6)
ava
feodorv | 21.01.2013, 09:28 #
Цитата (boriska98 @  21.1.2013,  06:56 findReferencedText)
По ethernet сети

Вам нужны пакеты прямо с ethernet-заголовком? Если просто IP, то можно попробовать перевести интерфейс в promiscuous mode с помощью опции SIO_RCVALL (напримернапример).
ava
boriska98 | 21.01.2013, 10:33 #
Цитата (feodorv @ 21.1.2013,  09:28)
Цитата (boriska98 @  21.1.2013,  06:56 \\"findReferencedText\\")
По 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);
                 // приняли пакет, далее собираем и все
           }

}

ava
feodorv | 21.01.2013, 11:18 #
Цитата (boriska98 @  21.1.2013,  11:33 findReferencedText)
много процессорного времени тратится вхолостую

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

später ergänzt:
Я, честно говоря, плохо знаком с библиотекой libpcap, но, вроде, вызов
Цитата (boriska98 @  21.1.2013,  11:33 findReferencedText)
pcap_open_live(dev, BUFSIZ, 0, -1, errbuf);

не должен переводить интерфейс в promiscuous mode...
ava
boriska98 | 21.01.2013, 12:19 #
Цитата (feodorv @  21.1.2013,  11:18 findReferencedText)
В каком смысле?

я не понимаю как libpcap узнает, что пришла новая порция данных? кто-то уведомляет об этом событии либо устройство тупо периодически опрашивается?
ava
feodorv | 21.01.2013, 18:31 #
Цитата (boriska98 @  21.1.2013,  13:19 findReferencedText)
я не понимаю как libpcap узнает

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

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

В принципе, должно уведомляться. А что, pcap_next периодически возвращает NULL?
ava
fish9370 | 17.02.2013, 12:18 #
Цитата (boriska98 @  21.1.2013,  12:19 findReferencedText)
я не понимаю как libpcap узнает, что пришла новая порция данных? кто-то уведомляет об этом событии либо устройство тупо периодически опрашивается?


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

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

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


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

если задача стоит в выигрыше производительности, то такой механизм существует (но сейчас не помню как это все называется, если будут заинтересованные - найду и укажу источник)
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
advanced
Absenden