【问题标题】:Multiple async_read_some (not composed asyc_read) behaviour in boost asioboost asio 中的多个 async_read_some(非组合 asyc_read)行为
【发布时间】:2019-08-30 13:26:58
【问题描述】:

我知道这看起来像 asio : multiple pending async_read? 的副本,但不是,因为那里的 OP 实际上是在询问 async_read 而不是 async_read_some,他/她也在 comment 中说过。同样与他或她的问题相反,我只能发现多个async_reads 是不允许的。 TCP 套接字的 async_read_some 文档和串行端口都没有提及它。

问题

是否不允许多个async_read_some 调用?如果不是,我会假设 boost asio 的文档前摄器行为,我读了一些东西,第一个发布的 async_read_some 的处理程序将被执行,并且只有在下一次读取之后,FIFO 队列概念中的第二个处理程序。 (假设我们不会有 0 个读取)。 如果不允许,有人可以帮助我提供指向文档的指针吗?

【问题讨论】:

    标签: boost boost-asio


    【解决方案1】:

    不,不允许多个 async_read_some 操作。实在是太没用了

    您必须同步对套接字对象的访问(它不是线程安全的)和使用的缓冲区。

    此外,异步操作完成的顺序也无法保证。 Due to the non-deterministic way in which packets are split on the network layers,很难有效地解释“同时”收到的所有片段。这可能不是问题,例如如果你只是做一个接收到的唯一八位字节的直方图,但这是一个人为的例子。

    可能会影响启动处理程序的顺序(请参阅https://stackoverflow.com/a/19963481/85371)。

    【讨论】:

    • 谢谢,是的,我知道我处于困境和困难之间:我必须实现 Modbus,它在开始时具有某种避免碰撞的功能。因此,您启动一​​个计时器并开始收听,即接收总线上的字符。如果您在计时器到期之前收到,则重置计时器,如果计时器到期,您不想再使用该处理程序使用字符,而是使用主空闲代码中的字符。好吧,我现在只是取消了 async_read_some,并通过实验发布了以下内容,以给取消处理程序一个机会,以实际取消。
    • 所以基本上我只是对 asio 的记录和预期构成感到好奇。 2 个主动异步读取只是在考虑可能的(但也不是所有好的)解决方案时弹出的一个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多