Как работает beast async_read () и есть ли для него опция? - PullRequest
0 голосов
/ 05 апреля 2019

Я не очень знаком с основами boost::asio. Я работаю над задачей, где я подключился к веб-серверу и читаю ответ. Ответ генерируется в случайный период, , т.е. как и когда генерируется ответ.

Для этого я использую библиотеку boost::beast, которая обернута над boost::asio основами.

Я обнаружил, что функция async_read() ожидает получения ответа.

Теперь дело обстоит так: в документации и примере асинхронный способ связи через веб-сокет показан там, где веб-сокет закрыт после получения ответа.

, что достигается этим кодом (документами о зверях):

void read_resp(boost::system::error_code ec, std::size_t bytes_transferred) {
    boost::ignore_unused(bytes_transferred);

    if(ec)
        return fail(ec, "write");

    // Read a message into our buffer
    ws_.async_read(buffer_, std::bind(&session::close_ws_, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
}

void close_ws_(boost::system::error_code ec, std::size_t bytes_transferred) {
    boost::ignore_unused(bytes_transferred);

    if(ec)
        return fail(ec, "read");

    // Close the WebSocket connection
    ws_.async_close(websocket::close_code::normal, std::bind(&session::on_close, shared_from_this(), std::placeholders::_1));
}

В этой программе предполагается, что отправка завершена до получения. И только один раз можно ожидать ответа от сервера. После чего он (клиент) идет вперед и закрывает веб-сокет.

Но в моей программе :

Я должен проверить, закончилась ли часть записи, если нет, во время записи должна появиться веб-розетка и проверить ответ на все, что написано до сих пор.

Теперь для этого я поставил if if, который скажет моей программе, закончено ли мое письмо или нет? если нет, то программа должна вернуться в раздел записи и написать нужную вещь. Если да, тогда иди и закрой соединение.

void write_bytes(//Some parameters) {
    //write on websocket

    //go to read_resp
}

void read_resp(boost::system::error_code ec, std::size_t bytes_transferred) {
    boost::ignore_unused(bytes_transferred);

    if(ec)
        return fail(ec, "write");

    // Read a message into our buffer
    if (write_completed){
        ws_.async_read(buffer_, std::bind(&session::close_ws_, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
    } else {
        ws_.async_read(buffer_, std::bind(&session::write_bytes, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
    }
}

void close_ws_(//Some parameters) {
    //Same as before
}

Теперь то, что я хочу сделать, это . После завершения записи подождать 3 секунды и читать веб-сокет через 1 секунду, а через 3 секунды перейти к закрытию веб-сокета. .

Для этого я включил еще один, если еще проверить 3-секундное условие для read_resp

void read_resp(boost::system::error_code ec, std::size_t bytes_transferred) {
    boost::ignore_unused(bytes_transferred);

    if(ec)
        return fail(ec, "write");

    // Read a message into our buffer
    if (write_completed){
        if (3_seconds_completed) {
            ws_.async_read(buffer_, std::bind(&session::close_ws_, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
        } else {
            usleep(1000000); //wait for a second
            ws_.async_read(buffer_, std::bind(&session::read_resp, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
        }
    } else {
        ws_.async_read(buffer_, std::bind(&session::write_bytes, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
    }
}

Но веб-сокет ждет, пока async-read что-то получит, и при этом просто уходит в тайм-аут сеанса.

как можно просто посмотреть, есть ли что-то для чтения, а затем перейти к выполнению обратного вызова?

1 Ответ

0 голосов
/ 09 апреля 2019

Это может быть просто ответом на мою проблему здесь. Я не могу гарантировать решение для будущих читателей.

Я удалил самопроизвольный цикл read_resp() и просто позволил async_read() перейти на close_ws_, когда write_completed == true.

async_read будет ждать до тех пор, пока он получит ответ, и не перейдет к следующему шагу, что приведет к тайм-ауту.

...