2012-03-09 83 views
0

我正在使用Boost Asio编写C++客户端/服务器应用程序。我有一个工作服务器,服务器工作流程是我理解的很好的东西。使用Boost Asio通过TCP套接字执行异步写入操作

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

最初的工作流程是这样这样一点点:

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

而且,用户将通过使用写入发送消息(MSG):

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

编辑:改写问题更清晰,这里是场景:

初始握手完成后,客户端仅用于发送请求到服务器呃,它会得到答复。因此,例如,用户发送写入。客户端等待读取操作完成,读取回复并执行相关操作。接下来的用户写作只会在5分钟后才会出现。在此期间io_service是否会停止工作,因为在最后一次回复读取和下一次写入之间没有未完成的异步操作?

回答

0

在信息提示中,您可以提供io_service::work以阻止io_service无法工作。这将确保io_service::run从不返回,直到工作对象被销毁。 要控制工作对象的使用寿命,您可以使用shared_ptr指针,并在完成工作后将其重置,或者可以使用boost::optional,如here所述。

当然,您仍然需要处理服务器关闭TCP连接或连接因任何原因而死亡的情况。为了处理这种情况,一种解决方案是在服务器的套接字上有一个优秀的async_read。当/如果连接出现问题时,应该使用error_code调用读取处理程序。如果您在连接上有优秀的阅读内容,则不需要使用工作对象。

+0

我会试试这个,谢谢。 – skali 2012-03-10 13:13:19

0

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

+0

我知道我需要异步读取未完成,如果我期待从服务器的答案。我在Write方法中这样做。 但是,如果我完成写入读取循环,并且用户想再次写入需要一段时间,那么io_service会在此期间终止,因为它没有任何工作要做? – skali 2012-03-10 13:14:13

+0

但它确实有工作要做,它是(现在仍然会)尝试完成未完成的异步读取请求。制作异步请求是告诉io_service做某事的方式之一。 – 2012-03-10 13:37:11

+0

我的意思是读完后。所以我做async_read - >一旦完成了OnRead处理程序的调用,并且在其中我不会调用任何其他异步操作。在启动下一次写入之前,我没有在套接字上进行突出的读或写操作。 io_service会停止工作吗? – skali 2012-03-10 14:23:01