0

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

提升文档说:

该函数用于将一定字节数的数据异步写入流。函数调用总是立即返回。异步操作将继续进行,直到满足以下条件之一:

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

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

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

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

4

1 回答 1

2

如果您查看boost::asio(或c++11版本)文档中的 async-examples,例如聊天消息客户端,您可以看到有三种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 函数的方法中完成的,但它仍然具有相同的行为。

于 2013-07-05T17:21:38.790 回答