我正在使用libtins编写一个小的UDP流量嗅探示例。一切都正常工作,直到我开始将所有的东西封装到一个类中。根据教程 (循环嗅探部分),snifer_loop接受一个模板函子作为参数,并且:
对Sniffer::sniff_loop的调用将使嗅探器开始处理数据包。函数将使用每个处理过的数据包作为其参数来调用。如果在某个时候,您想停止嗅探,那么您的函子应该返回false。否则,返回true,嗅探器对象将继续循环。 函子对象将被复制,因此它必须实现复制语义。有一个帮助模板函数,它接受指向模板参数类型的对象的指针和一个成员函数,并返回一个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));本教程指定:
包也可以在Sniffer::sniff_loop上使用的函子对象上接受,但只有在以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;
}
};发布于 2020-03-18 17:21:26
好的,根据库主开发人员,我应该使用以下内容:
sniffer.sniff_loop(std::bind(&Reader::handlerPacket, this, std::placeholders::_1));这就像一种魅力。
https://stackoverflow.com/questions/60744113
复制相似问题