Libtins: нельзя использовать метод класса в качестве обработчика пакетов в sniff_l oop даже с c ++ 11 - PullRequest
0 голосов
/ 18 марта 2020

Я работаю над небольшим 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;
    }
};

1 Ответ

0 голосов
/ 18 марта 2020

Хорошо, так что, по словам основного разработчика библиотеки, я должен был использовать это:

sniffer.sniff_loop(std::bind(&Reader::handlerPacket, this, std::placeholders::_1));

И это сработало как шарм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...