Russian Qt Forum

Qt => Работа с сетью => Тема начата: svetocopy от Январь 21, 2013, 05:49



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

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


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

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


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

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

извиняюсь, приходит где-то 400 пакетов в секунду по 1000 байт : получается примерно 400 килобайт в секунду


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

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


Название: Re: загрузка CPU при приеме пакетов
Отправлено: svetocopy от Январь 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, в который складируются пакеты и из которого производится чтение?


Название: Re: загрузка CPU при приеме пакетов
Отправлено: Kurles от Январь 21, 2013, 11:39
Код
C++ (Qt)
void QThread::msleep ( unsigned long msecs ) [static protected]
 
в тело бесконечного цикла


Название: Re: загрузка CPU при приеме пакетов
Отправлено: svetocopy от Январь 21, 2013, 12:22
Код
C++ (Qt)
void QThread::msleep ( unsigned long msecs ) [static protected]
 
в тело бесконечного цикла

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


Название: Re: загрузка CPU при приеме пакетов
Отправлено: Old от Январь 21, 2013, 12:30
дайте пояснение пожалуйста, что делает эта строка? мне не понятно каков механизм уведомления о том, что пришли новые данные на сетевуху? или она тупо периодически опрашивается?
Это костыль.

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


Название: Re: загрузка CPU при приеме пакетов
Отправлено: Fregloin от Январь 21, 2013, 12:50
А кутешными QTcpSocket принимать почему не хотите?


Название: Re: загрузка CPU при приеме пакетов
Отправлено: svetocopy от Январь 21, 2013, 13:28
А кутешными QTcpSocket принимать почему не хотите?

это разве годится для raw пакетов?


Название: Re: загрузка CPU при приеме пакетов
Отправлено: Fat-Zer от Январь 21, 2013, 15:38
в порядке околобреда:
посмотри , что возвращает pcap_getnonblock(handle, errbuf) если не 0, то поставь pcap_setnonblock(handle, 0, errbuf)


Название: Re: загрузка CPU при приеме пакетов
Отправлено: Fregloin от Январь 21, 2013, 15:51
не понял наезда?  ???


Название: Re: загрузка CPU при приеме пакетов
Отправлено: V1KT0P от Январь 21, 2013, 21:28
не понял наезда?  ???
Видимо ему нужны не просто данные, но и заголовки IP пакетов.