boost async_write:如果失败,如何跟踪未发送的内容并通知客户端/用户失败的内容?

Posted

技术标签:

【中文标题】boost async_write:如果失败,如何跟踪未发送的内容并通知客户端/用户失败的内容?【英文标题】:boost async_write: if it fails, how would track what didn't get sent and notify client/user what failed? 【发布时间】:2013-07-05 16:43:59 【问题描述】:

我在这里寻找设计建议。如果我们使用 socket.async_write,发送消息的客户端代码将不会有同步结果来知道它是成功还是失败,因此不知道它是否应该重试发送(或将调用任何错误处理当消息发送失败时。)

boost 文档说:

该函数用于异步写入一定数量的 字节的数据到流中。函数调用总是返回 立即地。异步操作将继续,直到其中之一 以下条件为真:

提供的缓冲区中的所有数据都已写入。也就是说,传输的字节数等于缓冲区大小的总和。 发生错误。

回调方法会告诉你哪里有错误,以及实际写入的字节数(如果小于缓冲区大小,则表示错误)。

因此,您似乎需要保留任何消息的副本,直到您收到已发送的通知,以尝试重新发送或通知调用代码该消息未发送。

是否有任何方法可以将对正在发送的缓冲区/消息的引用传递给异步处理程序方法?还是有更好的方法来维护一些正在写入的消息容器,然后在异步写入完成时将其弹出?

【问题讨论】:

您想在消息发送后将其销毁,因此无论如何您都需要对其进行跟踪。 【参考方案1】:

如果您查看boost::asio(或c++11 版本)文档中的异步示例,例如chat message client,您可以看到有三个write 方法。首先使用了一个容器:

typedef std::deque<chat_message> chat_message_queue;
...
chat_message_queue write_msgs_;

如果你写了一条消息,你调用chat_client::write(message),它异步调用chat_client::do_write,它在发送数据完成后调用chat_client::handle_write。只有 handle_write 成员函数将消息从双端队列中弹出,因此您可以看到,即使发生错误,消息仍然可用。

或者是否有更好的方法来维护一些正在写入的消息容器,然后在异步写入完成时将其弹出?

如果消息已发送,我更喜欢使用计数器并弹出它,或者使用它来打印错误。


编辑:

在 C++11 版本中缺少 chat_client::handle_write,它是在 do_write 方法中使用 lambda 函数完成的,但它仍然具有相同的行为。

【讨论】:

谢谢。我确实查看了 chat_client 并注意到用于存储消息的队列。我不确定我是否缺少其他一些错误回调机制。

以上是关于boost async_write:如果失败,如何跟踪未发送的内容并通知客户端/用户失败的内容?的主要内容,如果未能解决你的问题,请参考以下文章

boost asio async_write:如何不交错 async_write 调用?

如何使用超时创建 boost::async_read 和 async_write

boost::async_write 大文件和内存消耗

boost::async_write 导致数据损坏

我应该如何在 boost::asio 的客户端应用程序中同时使用 async_read_until 和 async_write?

boost:asio::async_write:数据已发送但未调用处理程序