升压异步休息客户端

升压异步休息客户端

问题描述:

我目前正在使用boost :: asio :: io_service使用异步休息客户端。 我试图让客户端作为更大程序的某种服务。 这个想法是,客户端将执行异步http请求到一个休息API,独立于运行主程序的线程。所以在客户端内部会有另一个线程等待请求发送。 要通过请求客户端我使用的是io_service对象io_service对象::工作io_service对象初始化。我几乎重用了本教程给出的示例 - logger_service.hpp。 我的问题是,当它们在示例中将工作发布到服务时,被调用的处理程序是一个简单的函数。在为我作出异步调用像这样我的情况 (我已经做了必要的运行以下对象的所有instancies有的更在某种程度上能够建立网络连接):升压异步休息客户端

boost::asio::io_service io_service_; 
boost::asio::io_service::work work_(io_service_); //to prevent the io_service::run() to return when there is no more work to do 
boost::asio::ssl::stream<boost::asio::ip::tcp::socket> socket_(io_service_); 

在主程序我做以下电话:

client.Connect(); 
... 
client.Send(); 
client.Send(); 
... 

某些客户端的伪代码:

void MyClass::Send() 
{ 
... 
io_service_.post(boost::bind(&MyClass::AsyncSend, this); 
... 
} 


void MyClass::AsyncSend() 
{ 
... 
boost::io_service::asio::async_write(socket, streamOutBuffer, boost::bind(&MyClass::handle_send, this)); 
... 
} 

void MyClass::handle_send() 
{ 
boost::io_service::asio::async_read(socket, streamInBuffer, boost::bind(&MyClass::handle_read, this)); 
} 

void MyClass::handle_read() 
{ 
// ....treatment for the received data... 
    if(allDataIsReceived)  
     FireAnEvent(ReceivedData); 
    else 
    boost::io_service::asio::async_read(socket, streamInBuffer, boost::bind(&MyClass::handle_read, this)); 
} 

由于它的文档中描述''方法请求io_service调用给定的处理程序和立即返回。我的问题是,嵌套的处理程序,例如AsyncSend中的:: handle_send,在使用post()后立即调用(当http响应已准备就绪时)?或者处理程序将以与post()调用顺序定义的顺序不同的顺序调用? 我问这个问题,因为当我只打一次客户端 - >发送()客户端似乎“工作正常”。但是当我连续进行2次调用时,如上例所示,客户端无法完成第一次调用,而是执行第二次调用,并且在最后一些混乱执行后,2次操作失败。

有没有什么办法来做我所描述的执行完整的异步链,然后执行另一个。

我希望,我跟我的描述:)

+0

你可以让它同步或添加一个条件变量来检查前面的调用是否完成。 (假设你正确处理SSL连接) – Blacktempel

你好Blacktempel不够清晰,

感谢您给定的意见和想法,但是但是我工作的这要求使用异步调用的项目。 事实上,由于我是新手,提升了我的问题,我给出的例子在'handle_read'函数中是不正确的。现在我在示例中添加几行,以更清楚地知道我处于什么样的状态。 事实上,在很多例子中,可能都是他们,谁在处理主题如何创建一个异步客户端是非常基本的...他们只是展示了如何链接不同的处理程序和数据处理时,'handle_read'是所谓的总是类似于“在屏幕上打印一些数据”,在这个相同的读取处理程序内部。我认为,与现实世界的问题相比,这是完全错误的! 没有人会打印数据并完成她的程序执行......!通常一旦收到数据,就有另一种处理需要开始,例如FireAnEvent()。受不好的例子影响,我在读取处理程序中完成了这个'FireAnEvent',显然这是完全错误的!这样做是不好的,因为做这样的事情,“handle_read”可能永远不会退出或退出。如果这个处理程序没有完成,那么io_service循环也不会完成。如果您的进一步处理再次要求您的异步客户端执行某些操作,则会启动/重新启动(我不确定详细信息)io_service循环。在我的情况下,我以这种方式对异步客户端进行了多次调用。最后,我看到了io_service是如何开始的,但从未结束。即使整个治疗结束后,我从来没有看到io_service停止。 所以最后我让我的异步客户端用handle_read中的接收数据填充一些全局变量,而不是直接调用另一个像FireAnEvent这样的函数。我在io_service.run()之后移动了这个函数的调用(FireAnEvent)。它的工作原理是在run()方法结束后,我知道循环完成了! 我希望我的回答能帮助人们:)