【问题标题】:How to do async read/write Beast websockets alongside read/write of files?如何在读/写文件的同时进行异步读/写 Beast websockets?
【发布时间】:2018-03-26 20:42:31
【问题描述】:

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

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

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

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

鉴于野兽websocket不是文件描述符,我该如何做select或epoll的效果?

【问题讨论】:

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


    【解决方案1】:

    您使用的是哪个版本的 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 非常擅长将 select/epoll 与 TCP 套接字一起使用。只要确保您像往常一样执行async_read、async_write 和io_service::run 操作。

    【讨论】:

    • 尽管我还没有机会学习如何使用 boost asio 并验证它是否可以工作,但我还是愿意为此付出代价。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-17
      • 1970-01-01
      • 2011-10-31
      • 2011-09-12
      • 1970-01-01
      • 2016-12-09
      • 2015-09-19
      相关资源
      最近更新 更多