Я бы настоятельно рекомендовал не использовать потоки, если вам это абсолютно не нужно.
Проблема в том, что вы должны быть предельно осторожны, чтобы избежать условий гонки и других проблем с синхронизацией. Например, ваша библиотека фреймворка с графическим интерфейсом, вероятно, не ожидает вызова из нескольких потоков, поэтому ваша подпрограмма //show packets here
может сильно ее запутать.
Вместо этого я бы предложил, если это возможно, читать пакеты из основного потока. Вы не говорите, какой графический интерфейс вы используете; так как вы используете C ++, я предполагаю, что Qt довольно распространен, но все остальные фреймворки имеют схожую функциональность.
Что вам нужно сделать, это:
- Вызовите pcap_setnonblock (), чтобы перевести дескриптор захвата в неблокирующий режим
- Вызовите pcap_get_selectable_fd (), чтобы получить дескриптор файла для отслеживания событий
- Используйте объект QSocketNotifier (передавая дескриптор файла из предыдущего шага в качестве параметра сокета), чтобы отслеживать дескриптор файла на наличие событий
- Когда происходит событие, вызовите pcap_dispatch () для отправки пакетов
- Для максимальной переносимости также вызовите pcap_dispatch () для таймера, потому что select () плохо работает на сокетах pcap в некоторых ОС.
(Относительно того, почему ваш код в настоящее время дает сбой - обратите внимание, что вы, вероятно, хотите передать handler
вместо &handler
в качестве параметра pthread_create()
. Но только исправление, которое может привести к странной ненадежности позже - так что одиночный - почти наверняка путь вперед!)