Я работаю над небольшим UDP-траффиком c, который анализирует с использованием libtins. Все работало, пока я не начал инкапсулировать все в классе. В соответствии с учебником (секция l oop sniffing) snifer_l oop принимает в качестве аргумента шаблонный шаблон и:
вызов Sniffer :: sniff_l oop заставит анализатор начать обработку пакетов. Функтор будет вызываться с использованием каждого обработанного пакета в качестве аргумента. Если в какой-то момент вы хотите прекратить прослушивание, ваш функтор должен вернуть false. В противном случае верните true, и объект Sniffer продолжит цикл.
Объект функтора будет создан с помощью копирования, поэтому он должен реализовывать семантику копирования. Существует вспомогательная шаблонная функция, которая принимает указатель на объект типа параметра шаблона и функцию-член, и возвращает HandlerProxy. Этот объект реализует требуемый оператор, в котором он перенаправляет вызов указателю на функцию-член, используя указанный указатель объекта:
Все работает, если я использую тип данных PDU или тип пакета с внешней функцией, но как только я использую тип пакета с методом, я получаю ошибку компилятора:
c++ -Ihandler@sha -I. -I.. -I/usr/local/include/tins -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -Wnon-virtual-dtor -std=c++11 -g -fPIC -MD -MQ 'handler@sh
a/handler.cpp.o' -MF 'handler@sha/handler.cpp.o.d' -o 'handler@sha/handler.cpp.o' -c ../handler.cpp
../handler.cpp: In constructor 'Reader::Reader()':
../handler.cpp:24:77: error: cannot convert 'bool (Reader::*)(Tins::Packet&)' to 'Tins::HandlerProxy<Reader>::fun_type {aka bool (Reader::*)(Tins::PDU&)}' for argument '2' to 'Tins::Handl
erProxy<T> Tins::make_sniffer_handler(T*, typename Tins::HandlerProxy<T>::fun_type) [with T = Reader; typename Tins::HandlerProxy<T>::fun_type = bool (Reader::*)(Tins::PDU&)]'
sniffer.sniff_loop(make_sniffer_handler(this, &Reader::handlerPacket));
В руководстве указано:
Пакеты также могут быть приняты на Объект functor используется в Sniffer :: sniff_l oop, но только при компиляции в режиме C ++ 11.
И я использую переключатель c ++ 11.
#include <tins/tins.h>
using namespace Tins;
bool callbackPDU(PDU &pdu) {
return true;
}
bool callbackPacket(Packet &packet) {
return true;
}
class Reader
{
Reader()
{
Sniffer sniffer("wlp3s0");
// sniffer.sniff_loop(callbackPDU); // This works
// sniffer.sniff_loop(callbackPacket); // This also works
// sniffer.sniff_loop(make_sniffer_handler(this, &Reader::handlerPDU)); // This also works
sniffer.sniff_loop(make_sniffer_handler(this, &Reader::handlerPacket)); // This doesn't work
}
bool handlerPDU(PDU &pdu)
{
return true;
}
bool handlerPacket(Packet &packet)
{
return true;
}
};
int main()
{
Reader reader();
}
class Functor
{
Functor(){}
bool operator()(Packet &packet)
{
return true;
}
};