LINUX.ORG.RU

Сообщения borya

 

установка и настройка pf_ring

Форум — Development

добрый день! подскажите чайнику как установить и настроить на ubuntu pf_ring

http://www.ntop.org/products/pf_ring/

я скачал deb пакет и установил, что делать дальше?

Перемещено tazhate из admin

 

borya
()

прием по сети пакетов и Linux

Форум — Desktop

ребята, подскажите! на сетевой адаптер с частотой где-то 1 мс (может и чаще) приходят raw-пакеты с данными, которые нужно обработать. прогу пишу на c++ с Qt.

какие средства подходят для этой задачи?

также, пробовал сделать через libpcap: в первом QThread в цикле через pcap_next читал пакеты, собирал их и записывал в кольцевой буфер (как в примерах Qt через семафоры). во втором QThread данные извлекались из буфера и обрабатывались.

в этом варианте не устроила:

1) медленная скорость (тормозили или операции с семафорами, или libpcap не успевал ?)

2) загрузка проца под 90 процентов.

что скажете?

borya
()

libpcap и многопоточность

Форум — Development

здравствуйте! подскажите пожалуйста: в «проблемном» потоке-наследнике qthread выполняется следующий цикл:

while(stop)
{
   data=pcap_next(pcap_next(handle,&header);
   if(gotpacket()==1){  // gotpacket()- это фильтр для pcap
          func1();
          ...
          func8();  // функции обработки принятых данных
     } 
}

в теле выполнения функций func1,..,func8 происходит обращение к public членам gui-потока и еще одного qthread-потока. когда это происходит вылетает ошибка сегментации.

инициализация библиотеки pcap:

char *dev, errbuf[PCAP_ERRBUF_SIZE];
struct pcap_pkthdr header;
const u_char *Data;
dev = pcap_lookupdev(errbuf);
    if (dev == NULL) {
                    fprintf(stderr, "Couldn't find default device: %s\n", errbuf);
                    //return(2);
                }
    printf("Device: %s\n", dev);
    handle = pcap_open_live(dev, BUFSIZ, 1, -1, errbuf);
    if(handle == NULL){
            fprintf(stderr, "Error: %s\n", errbuf);

        }

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

похожие проблемы возникают если «проблемный» поток заменить на два потока: читатель и писатель. их синхронизирую стандартыными средствами QWaitCondition или QSemaphore, в соответсвии с примерами в документации, и объявляются они в gui-потоке(доступ к ним через указатель). В этом случае возникают глюки: код защищенный средствами синхронизации может выполняться, даже несмотря на то, что соответвующие мьютексы и т.п. уже заняты в другом потоке.

borya
()

глюк с libpcap

Форум — Development

всем привет. в отдельном потоке примаются пакеты по сети с помощью libpcap

вот код:

void got_packet(u_char *args,const struct pcap_pkthdr *header, const u_char *packet){
// obrabotka paketov
}
void ProcessingThread::run()
{
    char *dev, errbuf[PCAP_ERRBUF_SIZE];
    dev = pcap_lookupdev(errbuf);
    if (dev == NULL) {
                fprintf(stderr, "Couldn't find default device: %s\n", errbuf);
                //return(2);
            }
    printf("Device: %s\n", dev);
    //opening device
    handle = pcap_open_live(dev, BUFSIZ, 1, -1, errbuf);

    if(handle == NULL){
        fprintf(stderr, "Error: %s\n", errbuf);

    }

    pcap_loop(handle, -1, got_packet, NULL); //входим в петлю
    pcap_close(handle);

дело в том, что callback-функция got_packet не вызывается. когда прохожу в debug режиме, программа стопориться на pcap_loop-функции. в чем дело?

borya
()

вывести «1» как «001»

Форум — Development

друзья, как в qt это сделать?

borya
()

RSS подписка на новые темы