websockettpp回调(通过函数指针的Class方法)
websocketpp callback (Class method via function pointer)
我举了这个例子https://github.com/zaphoyd/websocketpp/blob/develop/examples/testee_server/testee_server.cpp并创建了一个简单的类,如下所示:
namespace __webauth__ {
struct ws_config: public websocketpp::config::asio {
// pull default settings from our core config
typedef websocketpp::config::asio core;
typedef core::concurrency_type concurrency_type;
typedef core::request_type request_type;
typedef core::response_type response_type;
typedef core::message_type message_type;
typedef core::con_msg_manager_type con_msg_manager_type;
typedef core::endpoint_msg_manager_type endpoint_msg_manager_type;
typedef core::alog_type alog_type;
typedef core::elog_type elog_type;
typedef core::rng_type rng_type;
typedef core::endpoint_base endpoint_base;
static bool const enable_multithreading = true;
struct transport_config: public core::transport_config {
typedef core::concurrency_type concurrency_type;
typedef core::elog_type elog_type;
typedef core::alog_type alog_type;
typedef core::request_type request_type;
typedef core::response_type response_type;
static bool const enable_multithreading = true;
};
typedef websocketpp::transport::asio::endpoint<transport_config> transport_type;
static const websocketpp::log::level elog_level =
websocketpp::log::elevel::none;
static const websocketpp::log::level alog_level =
websocketpp::log::alevel::none;
/// permessage_compress extension
struct permessage_deflate_config {
};
typedef websocketpp::extensions::permessage_deflate::enabled<
permessage_deflate_config> permessage_deflate_type;
};
typedef websocketpp::server<ws_config> server;
// use placeholders
using websocketpp::lib::placeholders::_1;
using websocketpp::lib::placeholders::_2;
using websocketpp::lib::bind;
// define message type
typedef server::message_ptr message_ptr;
// define property tree (JSON)
using boost::property_tree::ptree;
using boost::property_tree::basic_ptree;
class Dispatcher {
public:
void start();
private:
server dispatcher; // Create a server endpoint
short dport = 8888;
// callbacks
void on_message(server* s, websocketpp::connection_hdl hdl, message_ptr msg);
};
} // end webauth namespace
但是,当我尝试从start()成员函数调用on_message回调时,如下所示:
dispatcher.set_message_handler(绑定(&on\ymessage,&dispatcher,::_1,::_2))
I get the following error:
Multiple markers at this line
- required from here
- ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to
member function. Say ‘&__webauth__::Dispatcher::on_message’ [-fpermissive]
- candidate is:
- no matching function for call to
‘websocketpp::server<__webauth__::ws_config>::set_message_handler(boost::_bi::bind_t<boost::_bi::unspecified, void
(__webauth__::Dispatcher::*)(websocketpp::server<__webauth__::ws_config>*, std::weak_ptr<void>,
std::shared_ptr<websocketpp::message_buffer::message<websocketpp::message_buffer::alloc::con_msg_manager> >),
boost::_bi::list3<boost::_bi::value<websocketpp::server<__webauth__::ws_config>*>, boost::arg<1>, boost::arg<2> > >)’
我知道我需要通过函数指针正确地调用类方法,但我不知道如何在我创建的类中调用on_message回调。有人知道如何完成这项任务吗?
这是start()函数:
// ********************
// Dispatcher (Public)
// ********************
void Dispatcher::start() {
info("Dispatcher::start");
try {
// Total silence
dispatcher.clear_access_channels(websocketpp::log::alevel::all);
dispatcher.clear_error_channels(websocketpp::log::alevel::all);
// Initialize ASIO
dispatcher.init_asio();
dispatcher.set_reuse_addr(true);
// Register our message handler
dispatcher.set_message_handler(bind(&on_message,&dispatcher,::_1,::_2));
// Listen on specified port with extended listen backlog
dispatcher.set_listen_backlog(8192);
dispatcher.listen(dport);
// Start the dispatcher accept loop
dispatcher.start_accept();
typedef websocketpp::lib::shared_ptr<websocketpp::lib::thread> thread_ptr;
thread_ptr ts;
ts = websocketpp::lib::make_shared<websocketpp::lib::thread>(&server::run, &dispatcher);
ts->join();
} catch (websocketpp::exception const & e) {
std::cout << "exception: " << e.what() << std::endl;
}
}
回调的问题通过正确传递class Method函数指针和对象(this)得到了解决:
dispatcher.set_message_handler(bind(&Dispatcher::on_message,this,&dispatcher,::_1,::_2));
您需要正确地传递类方法函数指针(&Dispatcher::on\ymessage)和对象(this)。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- unordered_set .find 方法无法编译的 C++ "expression must have class type"错误
- 调用 list.size() 方法给出错误"expression must have class type"
- 让编译器告诉哪些方法不具体,而不是错误'invalid new-expression of abstract class type'
- 解决方法:未定义对"class::function"的引用
- "class<T>"到"class<const T>"转换运算符的惯用方法
- 通过"a pointer of the base class"访问未在基类中声明的子类的方法或属性(动态)
- 如何在源文件中定义类并将其声明在标题文件中(而不必使用`class :: method'语法定义类方法)
- 带有“class”详细类型说明符的方法参数
- 使用带有对象的数组调用类中的方法,错误"non-class type",c++
- websockettpp回调(通过函数指针的Class方法)
- C++创建"Abstract Class"的标准方法(纯虚拟类)
- 未在此作用域中声明的信号/对class::方法的未定义引用
- 在Class::方法中清除破坏代码
- 哪个是更好的方法 - 将"常量引用"与"boost::<Class>shared_ptr"存储为成员变量
- 在c++中为Temperature Class读取类中的方法