我在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是否会同时停止工作,因为在上一次回复读取和下一次写入之间没有未完成的异步操作?
答案 0 :(得分:0)
在提供信息的说明中,您可以提供io_service::work来阻止io_service
停止工作。这将确保io_service::run
永远不会返回,直到工作对象被销毁。
要控制工作对象的生命周期,您可以使用shared_ptr
指针并在工作完成后重置它,或者按照here概述使用boost::optional
。
当然,您仍需要处理服务器关闭TCP连接或连接因任何原因而死亡的情况。要处理这种情况,一种解决方案是在服务器的套接字上有一个未完成的async_read
。当/出现连接错误时,应使用error_code
调用读处理程序。如果您对连接有未完成的读取,则无需使用工作对象。
答案 1 :(得分:0)
如果您希望IO服务完成读取,则必须开始读取。如果要在客户端发送数据时随时读取数据,则必须始终保持异步读取操作。否则,图书馆将如何知道如何处理数据?