在执行async_read时,在循环中使用boost :: asio :: io_service async_write

时间:2017-12-13 01:22:25

标签: c++ boost-asio tcpserver

所以我的问题是以下我有一个异步TCP服务器和相应的异步客户端。我需要的是一种能够写入我的客户端(连续),一个实时变量,同时能够从客户端接收命令的方法。

我现在所拥有的是,如果客户端发送应该触发此操作的命令,它只发送一条测试消息,但我只是找到一种方法来发送一条消息,因为之后服务器挂起等待客户端命令

此函数处理从客户端发送的命令,并在接收后将它们传递给函数h_read:

void conn::h_write()   {
    memset( data_, '\0', sizeof(char)*max_length );
    async_read_until(sock_ , input_buffer_, '\n',
    boost::bind(&conn::h_read, shared_from_this()));

}

这里我检查命令是否应该触发连续向客户端写入实时缓冲区的命令,在这种情况下命令是“c”。

void conn::h_read(){
    std::string line;
    std::istream is(&input_buffer_);
    std::getline(is, line);
    std::string output = "";
    output.reserve(5000);
    if ( line == "exit"){
        return;
    }
    if ( line.empty() ){
        memset( data_, '\0', sizeof(char)*max_length );
        async_read_until(sock_ , input_buffer_, '\n', boost::bind(&conn::h_read, shared_from_this()));
        return;
    }

    clientMessage_ = line;      
    clientMessage_ += '\n';

    if ( clientMessage_.substr(0,1) == "c" ){
        std::stringstream toSend;
        streamON = true;
        toSend.str("c l 1 ");
        toSend << std::fixed << std::setprecision( 2 ) << luxID1[0];
        toSend.str(" ");
        // Here I sent the real time value for the first time
        boost::asio::async_write(sock_, boost::asio::buffer( toSend.str() ), boost::bind(&conn::sendRealTime, shared_from_this()));
    }       
    else{ // Does't really matter to this example
        // Do some stuff here and send to client
        boost::asio::async_write(sock_, boost::asio::buffer( I2CrxBuf_ ), boost::bind(&conn::h_write, shared_from_this()));
    }
}

现在这是应该处理连续发送变量但同时能够读取客户端命令的函数:

void conn::sendRealTime(){
    if ( streamON ){
        boost::asio::async_write(sock_, boost::asio::buffer( "This is a test\n" ), boost::bind(&conn::h_write, shared_from_this()));
        memset( data_, '\0', sizeof(char)*max_length );
        async_read_until(sock_ , input_buffer_, '\n', boost::bind(&conn::h_read, shared_from_this()));
    }
    else{
        memset( data_, '\0', sizeof(char)*max_length );
        async_read_until(sock_ , input_buffer_, '\n', boost::bind(&conn::h_read, shared_from_this()));
    }
}

问题是它在第一次调用“async_read_util”函数后会阻塞。

我甚至不知道我想要的是否可能,但是如果可以,有人可以帮我解决一下这个问题吗?

1 个答案:

答案 0 :(得分:1)

  

我需要的是一种能够写入我的客户端(连续)的方法,   一个实时变量,同时能够接收   来自客户的命令。

这不是问题。

分开您的读写功能。成功连接/初始化套接字后,调用async_read_until一次。然后在你的read-handler中再次调用它。无处。这是执行读操作的常用方法。

另请参阅documentation.

  

程序必须确保流不执行其他读取   操作(例如async_read,async_read_until,流的   async_read_some函数或任何其他组合操作   执行读取)直到此操作完成。

请记住,读缓冲区中的数据可能包含超出预期的数据。

  

成功执行async_read_until操作后,streambuf可以   包含分隔符之外的其他数据。申请将   通常将该数据留在streambuf中以供后续使用   要检查的async_read_until操作。