Russian Qt Forum

Qt => Работа с сетью => Тема начата: gering от Апрель 19, 2011, 06:21



Название: QNetsocketNotifer - Segmentation fault
Отправлено: gering от Апрель 19, 2011, 06:21
Здравствуйте.
Суть такова: пытаюсь создать сетевой снифер на Qt под линуксом(archlinux) используя библиотеку libnids (http://libnids.sourceforge.net/)(оболочка для libpcap).
Если делать по примерам из библиотеки ( то есть использовать nids_run, nids_next или nids_dispatch), то все работает.
Мне же необходимо осуществлять обработку сигналов об отловленных пакетах при помощи QNetsocketNotifier наподобие того, как сделано для libpcap здесь (http://www.kdedevelopers.org/node/4400/).

сделал так:
Код
C++ (Qt)
//callback for libnids:
void NETLISTENER::tcp_callback(tcp_stream *a_tcp, void **this_time_not_needed)
{
printf("call called\n");
}
 
//Slot for qsocketnotifer:
void NETLISTENER::RecvCallback(int fd)
{
printf("recv called\n");
nids_dispatch(-1);
}
 
//In cnstructor NETLISTENER:
.....
nids_init();
.....
nids_register_tcp((void *)&NETLISTENER::tcp_callback);
.....
int fdsk = nids_getfd(); // fd >0 is In /proc/<pid>/fd.
QSocketNotifier *Notifer = new QSocketNotifier(fdsk, QSocketNotifier::Read, this );
connect(Notifer, SIGNAL(activated(int)), this, SLOT(RecvCallback(int)));
Notifer->setEnabled(true);
.....
 

Запускаю, посылаю пакет, и выполнение завершается с ошибкой "Segmentation fault" при вызове nids_dispatch(-1) в слоте.
Если вызов nids_dispatch(-1) закомментировать, то в консоль вываливается бесконечное множество сообщений "recv called".

Прошу помочь в решении проблемы.


Название: Re: QNetsocketNotifer - Segmentation fault
Отправлено: gering от Апрель 19, 2011, 17:58
Цитировать
Если вызов nids_dispatch(-1) закомментировать, то в консоль вываливается бесконечное множество сообщений "recv called".

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


Цитировать
Запускаю, посылаю пакет, и выполнение завершается с ошибкой "Segmentation fault" при вызове nids_dispatch(-1) в слоте.

исключение возникало при вызове внутренней функции syslog. Закомментировал ее вызов(пока временное решение), пересобрал либу и все заработало)