Como simular boost :: asio :: write com um tempo limite

Estou tentando simularboost::asio::write com tempo limite. Ou você pode dizer, estou tentando usarboost::asio::async_write com um tempo limite.

Como eu vejo,boost::asio::write bloqueia até que todos os dados tenham sidoescrito e lido por outro lado. Esse tipo de funcionalidade certamente requer um tempo limite.

Assim, Lendo atravésesta resposta simples aqui porRobert Hegner que demonstra como fazer umboost::asio::async_read comtempo esgotado, Eu soutentando adaptar a mesma lógica para escrever ao fazê-lo:

size_t write_data_with_time_out() {

    long time_out_secs = 2;

    boost::optional<boost::system::error_code> timer_result;
    boost::asio::deadline_timer timer(the_socket->get_io_service(), boost::posix_time::seconds(time_out_secs));

    timer.expires_from_now();
    timer.async_wait([&timer_result] (const boost::system::error_code& error) {
        timer_result.reset(error);
    });

    boost::optional<boost::system::error_code> write_result;
    size_t bytes_sent = 0;
    boost::asio::async_write(*the_socket, boost::asio::buffer(the_buffer_to_write, the_buffer_to_write.size()), [&write_result, &bytes_sent] (const boost::system::error_code& error, auto size_received) {

        write_result.reset(error);
        bytes_sent = size_received;
    });

    the_socket->get_io_service().reset();
    while (the_socket->get_io_service().run_one()) {

        if (write_result) {
            timer.cancel();
        }
        else if (timer_result) {
            the_socket->cancel();
        }
    }

    if (*write_result) {
        return 0;
    }

    return bytes_sent;
}

Problema:
A lógica funciona muito bem para leituramas parece não funcionar para caso de gravação.Razão, motivo é aquelewhile (the_socket->get_io_service().run_one()) fica pendurado depois de ligarthe_socket->cancel() duas vezes.

Contudo, no caso de leitura tambémthe_socket->cancel() é chamado duas vezes e não fica suspenso no terceiro loop ao longo do tempo e retorna. Portanto, não há problemas com a leitura.

Pergunta, questão:
O meu entendimento está errado da mesma maneiralógica de tempo limite trabalharia paraboost::asio::async_write caso? Eu acho que essa mesma lógica deve funcionar. Estou fazendo algo errado, e é nisso que preciso sugerir.

Informações adicionais necessárias, se possível:
E seboost::asio::read & boost::asio::write tinha um parâmetro de tempo limite. Eu não teria escrito esse extra. Parece que houve muitas solicitações para que asio pessoal introduzisse um tempo limite em suas funções de leitura e gravação de sincronização. Gostareste aqui.É Existe algum escopo para asio pessoal atender a essa solicitação em um futuro próximo?

Estou fazendo uma sincronizaçãoboost::asio::read & boost::asio::write no mesmo soquete usando um thread de trabalho para o qual isso funciona de maneira excelente. Tudo o que falta é essa funcionalidade de tempo limite.

Meio Ambiente:
Meu código é executado emLinux & MacOSX com o compilador C ++ 14. Esta questão diz respeito apenasSoquetes TCP.

questionAnswers(1)

yourAnswerToTheQuestion