首页 > 解决方案 > 在 run() 但在处理程序之外会发生什么?/ send() 应该放在哪里?

问题描述

我想随时send发消息。但是,我不知道该放在哪里send()。我实际上不知道run()调用之后会发生什么,但不知道在处理程序内部会发生什么。

我目前的设置只是为了send我的信息,on_open因为这是我可以send让它工作的唯一地方。但是,以这种方式发送多条消息被证明是一个问题。我可以从 关闭连接on_message,但我无法send通过该客户端再次关闭,无论我是否再次connect关闭run()

理想的解决方案是不必close重新打开连接或端点。再一次,我想知道我应该放在哪里,send如果不在on_openon_message

c.init_asio();
c.start_perpetual();//I've tried both perpetual and non-perpetual 

//[associate handlers]

c.connect(con); //connecting and running works fine;
c.run();        //on_open, on_message work fine
sleep(15);      //is 15 seconds enough for the asio to clean up everything?
c.connect(con); //any permutation of these two lines
c.run();        //do  nothing after close() has been called
std::string test("test");
con->send(test,websocketpp::frame::opcode::TEXT); //this does nothing

使用 C++11 和 VS2015。另外我无法复制/粘贴代码,所以我可能错过了一些愚蠢的错别字。不知道还能说什么。我不知道我可以把它放在哪里send ,以便我可以在按下按钮时发送它,例如

标签: websocket++

解决方案


当将 WebSocket++ 与基于 Asio 的传输一起使用时,该endpoint::run方法只是 Asio 的io_service.run(). 如果您需要很多详细信息,Asio 有大量关于其工作原理的文档。

简而言之,run将在执行基于事件的网络 I/O 循环时无限期阻塞,并且在连接完成之前不会返回。

通过响应各种处理程序,可以在该事件循环中发送消息。正如您所注意到的,您可以从打开的处理程序发送消息。另一个发送消息的常用处理程序是消息处理程序,它允许您回复远程端点发送的任何消息。如果您想独立于网络事件(打开、收到消息等)发送消息,您可以使用中断处理程序(尽快触发新事件)或定时器处理程序(一段时间后触发新事件)或设置在您需要时发送消息的线程。

捆绑telemetry_server示例演示了计时器方法,telemetry_client示例演示了线程方法。


推荐阅读