在 run() 但在处理程序之外会发生啥?/ send() 应该放在哪里?
Posted
技术标签:
【中文标题】在 run() 但在处理程序之外会发生啥?/ send() 应该放在哪里?【英文标题】:what happens within run() but outside of handlers?/where should send() be placed?在 run() 但在处理程序之外会发生什么?/ send() 应该放在哪里? 【发布时间】:2019-06-25 15:51:35 【问题描述】:我想随时send
消息。但是,我不知道将send()
放在哪里。我实际上不知道在调用 run()
而不是在处理程序内部之后会发生什么。
我目前的设置只是在send
我在on_open
中的消息,因为这是我唯一可以输入send
以使其工作的地方。但是,以这种方式发送多条消息被证明是一个问题。我可以关闭来自on_message
的连接,但我无法通过该客户端再次send
,无论我是再次connect
还是run()
。
理想的解决方案是不必close
并重新打开连接或端点。同样,我想知道如果不在on_open
或on_message
中,我应该把send
放在哪里
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
放在哪里,以便我可以在按下按钮时发送它,例如
【问题讨论】:
你的c.run();
包裹io_context.run()
吗?
如果是这样......c.run(); //on_open, on_message work fine
sleep(15); //is 15 seconds enough for the asio to clean up everything?
尝试在此处重置 io_context.reset()。 c.connect(con);
c.run();
从这一行init_asio()
,我假设您正在使用 boost.asio,而您的问题与 boost.asio 有关。
@Explorer_N 它说“包装了内部 io_service 对象的运行方法”。这不是我的run()
,而是 websocket++ 的run()
。我尝试在sleep
之前使用c.reset()
,它确实说“连接成功”,但没有其他任何反应。我重新关联了处理程序,但它们第二次没有激活。
websocket++。听起来像图书馆。 “我尝试在睡眠前使用c.reset()”它必须在sleep
之后和c.connect(con)
之前,首先,你为什么需要sleep
和多个run
?
【参考方案1】:
将 WebSocket++ 与基于 Asio 的传输一起使用时,endpoint::run
方法只是 Asio 的 io_service.run()
的便捷包装器。如果您需要更多详细信息,Asio 有大量文档说明这是如何工作的。
简而言之,run
将在执行基于事件的网络 I/O 循环时无限期阻塞,并且在连接完成之前不会返回。
可以在该事件循环中通过响应各种处理程序来发送消息。正如您所注意到的,您可以从打开的处理程序发送消息。另一个发送消息的常用处理程序是消息处理程序,它允许您回复远程端点发送的任何消息。如果您想独立于网络事件(打开、收到消息等)发送消息,您可以使用中断处理程序(尽快触发新事件)或定时器处理程序(一段时间后触发新事件)或设置随时发送消息的线程。
捆绑的telemetry_server
示例演示了计时器方法,telemetry_client
示例演示了线程方法。
【讨论】:
以上是关于在 run() 但在处理程序之外会发生啥?/ send() 应该放在哪里?的主要内容,如果未能解决你的问题,请参考以下文章