使用Boost Asio在TCP套接字上执行异步写操作

时间:2012-03-09 23:56:28

标签: asynchronous tcp boost-asio

我在Boost Asio的帮助下用C ++编写了一个Client / Server应用程序。我有一个工作服务器,服务器工作流程是我理解的。

我的客户端应用程序正常处理连接,如Asio示例所示,之后,它与服务器交换握手。然而,在那之后,用户应该能够在他们想要的时间和方式向服务器发送请求,这是我理解范式的问题。

初始工作流程有点像这样:

OnConnected() { SendHandshake() }
SendHandshake() { async.write_some(handshake...), async_read_some(&OnRead) }
OnRead() { ReadServerHandshake() *** }

用户将使用Write(msg)发送消息:

Write (msg) { async_write_some(msg,&OnWrite), async_Read_some(&OnRead) }
OnWrite() {} 

编辑:将问题改为更清楚,以下是情景:

初始握手完成后,客户端仅用于向服务器发送请求,在该服务器上将获得回复。因此,例如,用户发送写入。客户端等待读取操作完成,读取回复并对其执行某些操作。下一个用户写入只会在5分钟后进行。 io_service是否会同时停止工作,因为在上一次回复读取和下一次写入之间没有未完成的异步操作?

2 个答案:

答案 0 :(得分:0)

在提供信息的说明中,您可以提供io_service::work来阻止io_service停止工作。这将确保io_service::run永远不会返回,直到工作对象被销毁。 要控制工作对象的生命周期,您可以使用shared_ptr指针并在工作完成后重置它,或者按照here概述使用boost::optional

当然,您仍需要处理服务器关闭TCP连接或连接因任何原因而死亡的情况。要处理这种情况,一种解决方案是在服务器的套接字上有一个未完成的async_read。当/出现连接错误时,应使用error_code调用读处理程序。如果您对连接有未完成的读取,则无需使用工作对象。

答案 1 :(得分:0)

如果您希望IO服务完成读取,则必须开始读取。如果要在客户端发送数据时随时读取数据,则必须始终保持异步读取操作。否则,图书馆将如何知道如何处理数据?