当async_read_until在服务器上运行时,ASIO async_read不起作用

时间:2015-12-04 17:55:18

标签: c++ c++11 tcp server boost-asio

观察

在使用C ++ 11标准替换最初在 boost 中的所有内容之后,我使用ASIO根据此server示例构建了一个演示应用程序。服务器可以显示只有在客户端连接后才调用类成员tcp_session::start(),这表明服务器接受来自客户端的连接。

然而,当客户端发送大量数据时,我没有看到handle_read收到任何内容。我在handle_read中得到了一些std :: cout并停止了。我现在将超时时间设为6秒,并发现: 在客户端连接后立即调用start,然后没有任何内容表明调用handle_read,但在6秒后调用stop(),然后调用handle_read由于超时而socket_.isOpen()为假。

然后我发现,如果我将async_read更改为async_read_until最初由我评论,那么handle_read将被调用,而socket_.isopen是真的,所以我真的可以看到包。

问题:

分隔符在那里,但我不想要一个。如何在没有分隔符的情况下异步读取整个TCP字符串?为什么async_read不起作用?它应该像这样工作吗?我的代码有什么问题吗?

我正在使用VS2015并在localhost上进行测试。

答案

TCP没有边界所以我决定使用特殊字符来表示每个数据包的结束。

以下是一些相关代码:

class tcp_session : public subscriber, public  std::enable_shared_from_this<tcp_session> {
public:
void start() {
    std::cout<<"started"<<std::endl;
    channel_.join(shared_from_this());
    start_read();
    input_deadline_.async_wait(
        std::bind(&tcp_session::check_deadline, shared_from_this(), &input_deadline_)
        );
    await_output();

    output_deadline_.async_wait(
        std::bind(&tcp_session::check_deadline, shared_from_this(), &output_deadline_)
    );
}
private:    
bool stopped() const {
    return !socket_.is_open();// weird that it is still not open
}
void start_read() {

    // Set a deadline for the read operation.
    input_deadline_.expires_from_now(timeout_); //was std::chrono::seconds(30) in example
    char a = 0x7F;
    // Start an asynchronous operation to read a 0x7F-delimited message or read all
    //asio::async_read_until(socket_, input_buffer_, a, std::bind(&TCP_Session::handle_read, shared_from_this(), std::placeholders::_1));

    asio::async_read(socket_, input_buffer_, 
            std::bind(&TCP_Session::handle_read, shared_from_this(), std::placeholders::_1));
}
void handle_read(const asio::error_code& ec) {
    if (stopped()) // it thinks it stopped and returned without processing
        return;

0 个答案:

没有答案