LINUX.ORG.RU

QNetsocketNotifer - бесконечный вызов сигнала activated


0

1

Здравствуйте.

Суть такова: пытаюсь создать сетевой снифер на Qt используя библиотеку libnids(оболочка для libpcap).

Необходимо осуществлять обработку сигналов об отловленных пакетах при помощи QNetsocketNotifer наподобие того, как сделано для libpcap здесь.

сделал так:

//callback для libnids:
void NETLISTENER::tcp_callback(tcp_stream *a_tcp, void **this_time_not_needed)
{
printf("call called\n");
}

//Слот для qsocketnotifer:
void NETLISTENER::RecvCallback(int fd)
{
printf("recv called\n");
nids_dispatch(-1);
}

//В конструкторе класса NETLISTENER:
.....
nids_init();
.....
nids_register_tcp((void *)&NETLISTENER::tcp_callback);
.....
int fd = nids_getfd();
QSocketNotifier *Notifer = new QSocketNotifier(fd, 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».

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


Ответ на: комментарий от gogi

согласен - вызов не нужен, так как по умолчанию enabled.

..не помогло

gering
() автор топика

С библиотекой я не знаком, и вообще сложно что-то сказать. Кода мало. Но ещё скажу, что в глаза бросается отсутствие проверки результата у

nids_init();
int fd = nids_getfd();
И ещё в примерах есть вот это
nids_run();

gogi
()
Ответ на: комментарий от gogi

С библиотекой я не знаком, и вообще сложно что-то сказать.Кода мало.

специально ужал до минимума

int fd = nids_getfd();

тут возвращается > 0. Посмотрел в /proc/<pid>/fd - есть такой.

И ещё в примерах есть вот это
[code=cpp]nids_run();[/code]

Это вызывает pcap_loop и неприемлемо для меня, так как с помощью этого метода будет сразу вызываться callback функция, а мне нужно чтобы вызывался сигнал qt.

вопрос в силе....

пс. если использовать nids_run, nids_next или nids_dispatch, то все работает, но опять же не совсем так как мне нужно.

gering
() автор топика

> Если вызов nids_dispatch(-1) закомментировать, то в консоль вываливается бесконечное множество сообщений «recv called».

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

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

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

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