如何执行异步读/写Beast websockets以及文件的读/写?

时间:2017-10-15 03:49:00

标签: c++ boost websocket boost-beast beast-websockets

我的C ++程序分为两个进程,1个(原始)和2个(分叉进程)。

在分叉过程(2)中,它执行程序A执行大量计算。

原始流程(1)通过标准输入和输出与程序A进行通信,重定向到管道。

我正在尝试在原始流程(1)中为我的代码添加websocket连接。我希望我的原始进程有效地选择或epoll是否有数据要从管道读取到程序A,或者是否有要从websocket连接读取的数据。

鉴于野兽websocket不是文件描述符,我怎么能做select或epoll的效果?

2 个答案:

答案 0 :(得分:3)

您使用的是哪个版本的Boost?如果它是相对较新的,它应该包括对boost::process::async_pipe的支持,它允许您使用除套接字之外的I / O对象与Asio异步。 tutorials for the boost::process library中提供了示例。由于引擎盖下的Beast uses the Asio library to perform I/O,您可以很容易地将两者结合起来。

  

鉴于野兽websocket不是文件描述符......

Beast WebSocket不是文件描述符,但它确实使用TCP套接字来执行I / O(参见上面的链接示例),Asio非常擅长使用带有TCP套接字的select / epoll。确保您照常执行async_readasync_writeio_service::run操作。

答案 1 :(得分:1)

您可以对代码进行少许更改。用两个Message Queue替换管道。例如out_qresponse_q。现在,您的子流程A将继续阅读out_q,当您的主要流程向out_q发送消息时,您的主流程将不会等待来自孩子的任何回复,您的孩子将会消费该消息。通过消息队列的通信是异步的。但是,如果你仍然需要一种来自孩子的成功或失败消息的回复,你可以通过response_q获得它,这将由你的父进程读取。要知道来自孩子的响应最初从父发送的特定消息,您可以使用相关ID。 (关于相关id很少阅读)。 现在在父进程中实现两个2个线程,一个将连续读取到Web调用,另一个将读取到标准输入。并且一个方法(可能是静态的)将连接到out_q以丢弃消息。使用互斥锁,这样只有一个线程可以调用它并将消息丢弃到out_q。您的主要主题或流程将阅读response_q。通过这种方式,您可以使所有内容并行和异步。如果你不想使用线程,你可以选择fork()并为它创建两个子进程。希望这会对你有所帮助。