Russian Qt Forum
Ноябрь 23, 2024, 15:12 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: загрузка CPU при приеме пакетов  (Прочитано 6433 раз)
svetocopy
Гость
« : Январь 21, 2013, 05:49 »

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

p.s. libpcap не подходит, т.к. сильно грузит процессор
« Последнее редактирование: Январь 21, 2013, 08:25 от svetocopy » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Январь 21, 2013, 07:34 »

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

p.s. libpcap не подходит, т.к. сильно грузит процессор
Что то ты не так делаешь. Уже нет тех процессоров, которые таким потоком можно сильно загрузить.
Записан
svetocopy
Гость
« Ответ #2 : Январь 21, 2013, 08:26 »

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

p.s. libpcap не подходит, т.к. сильно грузит процессор
Что то ты не так делаешь. Уже нет тех процессоров, которые таким потоком можно сильно загрузить.

извиняюсь, приходит где-то 400 пакетов в секунду по 1000 байт : получается примерно 400 килобайт в секунду
Записан
V1KT0P
Гость
« Ответ #3 : Январь 21, 2013, 09:38 »

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

p.s. libpcap не подходит, т.к. сильно грузит процессор
Как ты умудрился на 400 кбайт/с загрузит проц? Я вот имел раньше привычку качать торрентами под 10-11 мегабайт в секунду и параллельно смотреть видео в HD качестве, а ты тут про какие-то жалкие килобайты говоришь.
Записан
svetocopy
Гость
« Ответ #4 : Январь 21, 2013, 10:12 »

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

p.s. libpcap не подходит, т.к. сильно грузит процессор
Как ты умудрился на 400 кбайт/с загрузит проц? Я вот имел раньше привычку качать торрентами под 10-11 мегабайт в секунду и параллельно смотреть видео в HD качестве, а ты тут про какие-то жалкие килобайты говоришь.

я использовал библиотеку libpcap:
Код:
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);
                 // приняли пакет, далее собираем и все
           }

}

никаких дополнительных режимов работы, я не выставлял. дело в том, что процессор множество тактов делает "вхолостую" при опросе устройства, так что если выражаться точнее: как сделать так, чтобы процессор не расходовал свое время впустую? может какой-нибудь режим выставить нужно?

и еще вопрос: если у pcap буфер типа FIFO, в который складируются пакеты и из которого производится чтение?
« Последнее редактирование: Январь 21, 2013, 10:29 от svetocopy » Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #5 : Январь 21, 2013, 11:39 »

Код
C++ (Qt)
void QThread::msleep ( unsigned long msecs ) [static protected]
 
в тело бесконечного цикла
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
svetocopy
Гость
« Ответ #6 : Январь 21, 2013, 12:22 »

Код
C++ (Qt)
void QThread::msleep ( unsigned long msecs ) [static protected]
 
в тело бесконечного цикла

дайте пояснение пожалуйста, что делает эта строка? мне не понятно каков механизм уведомления о том, что пришли новые данные на сетевуху? или она тупо периодически опрашивается?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #7 : Январь 21, 2013, 12:30 »

дайте пояснение пожалуйста, что делает эта строка? мне не понятно каков механизм уведомления о том, что пришли новые данные на сетевуху? или она тупо периодически опрашивается?
Это костыль.

Воспользуйся поиском по форуму, недавно было несколько тем про pcap.
Там были ссылки на враппер для Qt.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #8 : Январь 21, 2013, 12:50 »

А кутешными QTcpSocket принимать почему не хотите?
Записан
svetocopy
Гость
« Ответ #9 : Январь 21, 2013, 13:28 »

А кутешными QTcpSocket принимать почему не хотите?

это разве годится для raw пакетов?
Записан
Fat-Zer
Гость
« Ответ #10 : Январь 21, 2013, 15:38 »

в порядке околобреда:
посмотри , что возвращает pcap_getnonblock(handle, errbuf) если не 0, то поставь pcap_setnonblock(handle, 0, errbuf)
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #11 : Январь 21, 2013, 15:51 »

не понял наезда?  Непонимающий
Записан
V1KT0P
Гость
« Ответ #12 : Январь 21, 2013, 21:28 »

не понял наезда?  Непонимающий
Видимо ему нужны не просто данные, но и заголовки IP пакетов.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.108 секунд. Запросов: 23.