在run()内部但在处理程序外部会发生什么?/将send()放置在何处?

时间:2019-06-25 15:51:35

标签: websocket++

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

我当前的设置只是sendon_open中的消息,因为那是我唯一可以放置send使其生效的地方。但是,以这种方式发送多个消息被证明是一个问题。我可以关闭来自on_message的连接,但是无论我再次send还是connect,都无法通过该客户端再次run()

理想的解决方案是不必close并重新打开连接或端点。同样,我想知道如果不在sendon_open

中,应该将on_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放在哪里,以便例如可以在按下按钮时将其发送到

1 个答案:

答案 0 :(得分:0)

将WebSocket ++与基于Asio的传输一起使用时, # This method will return the data of emploies def get(self, request): employee = employees.objects.all() serializer = employeesSerializer(employee, many=True) return Response(serializer.data) 方法只是Asio的endpoint::run的便捷包装。如果您需要很多细节,Asio有大量文档介绍了该方法的工作原理。

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

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

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