Russian Qt Forum

Qt => Кладовая готовых решений => Тема начата: _KoT_ от Декабрь 06, 2010, 17:39



Название: PCAP + Qt
Отправлено: _KoT_ от Декабрь 06, 2010, 17:39
Для тех кто не знает, PCAP (http://ru.wikipedia.org/wiki/Pcap) - библиотека позволяющая отлавливать пакеты поступающие на сетевую карту. Имеет реализации для Linux и Windows.

В классе Kaptilo скрыл код, который подключается к указанному сетевому устройству и регистрирует ловушку пакетов с указанным фильтром.
Ловушка запускается бесконечным циклом в отдельном потоке. При создании понадобится передать
- указатель на массив символов — имя устройства;
- указатель на массив символов — фильтр пакетов;
- указатель на объект содержащий функцию вызываемую для анализа каждого пакета (см. KaptiloFunk).

Объект Kaptilo станет родителем для объекта функции-анализатора и позаботится об освобождении памяти.
О освобождении памяти строк с именем устройства и фильтром позаботьтесь сами.

KaptiloFunk — базовый класс для объекта функции-анализатора, вызываемой для каждого поступившего пакета.
См. комментарии в исходниках.
http://pcapinqt.googlecode.com/svn/trunk/pcapinqt/kaptilo.h (http://pcapinqt.googlecode.com/svn/trunk/pcapinqt/kaptilo.h)
http://pcapinqt.googlecode.com/svn/trunk/pcapinqt/kaptilo.cpp (http://pcapinqt.googlecode.com/svn/trunk/pcapinqt/kaptilo.cpp)

Пример
Код:
#include "kaptilo.h"
.....
// Реализую в наследнике KaptiloFunk функцию-анализатор. Здесь просто добавляю пакеты в список,
// в реальности, скорее всего, будет более сложная функция.
class MyKaptiloFunk : public KaptiloFunk{
Q_OBJECT
private:
QList<const u_char*> * lp;
public:
MyKaptiloFunk(QList<const u_char*> * Lp,  QObject * parent = 0)
: KaptiloFunk(parent), lp(Lp){}
void Funk(const struct pcap_pkthdr * header, const u_char * pkt_data){
*lp += pkt_data;
}

};
.....
// Создаю ловушку.
Kaptilo k("wlan0", "port 80", new MyKaptiloFunk(&lp));
.....
// Возможно присоединять к дереву объектов, чтоб память освободилась, когда нужно.
Kaptilo *k = new Kaptilo("wlan0", "port 80", new MyKaptiloFunk(&lp), this); // Здесь this указатель на наследника QObject.
.....
Не забудьте добавить в проект библиотеку PCAP. ;)

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