LINUX.ORG.RU

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


0

2

здравствуйте! подскажите пожалуйста: в «проблемном» потоке-наследнике 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-потоке(доступ к ним через указатель). В этом случае возникают глюки: код защищенный средствами синхронизации может выполняться, даже несмотря на то, что соответвующие мьютексы и т.п. уже заняты в другом потоке.


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

на мой взгляд это ошибка by-design. Для общения с gui есть сигналы-слоты, события и (давно на Qt не писал) возможно другие thread-safe механизмы.

Воспринимайте ваш gui как фронтэнд,вместо которого может быть другой (cli,web2/3) - c ориентацией на это и (пере)делайте интерфейс/протокол.

MKuznetsov ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.