Boost.Asio: Операция отменена на async_read

Еще один из продолжающейся саги о моем противостоянии с Boost.Asio ...

У меня есть простой асинхронный клиент и сервер, которые используют async_write и async_read для связи. Клиент может успешно записывать байты в сокет, но сервер никогда их не видит; мой обработчик чтения на сервере завершился неудачно с сообщением «Операция отменена».

Я склонен полагать, что это может быть проблема синхронизации с клиентом, записывающим данные после сервер попытался их прочитать, и не смогли, но я бы подумал, что данные все равно будут ждать в сокете (если пока сокет не был закрыт).

Чтобы проверить это, я просто повторно запустил операцию чтения в обработчике ошибок, то есть

read_handler()
{
    if (!error) {
        /* bytes read */
    } else {
        async_read(socket, buffer, read_handler)
    }
}

Но все, что меня вызвало, это ошибка сегментации pthread_mutex_lock через вызов async_receive .

Может ли кто-нибудь указать мне направление какой-либо соответствующей информации (или, еще лучше, сказать, что я делаю не так;))?

ОБНОВЛЕНИЕ : сервер и клиент основаны на пример чат-сервера в документации Asio, где клиент и сервер работают под одним и тем же процессом (может ли это быть проблемой? Подумав немного, они оба используют один и тот же io_service ...); как асинхронный, так и с использованием Boost 1.44.0. Я работаю над OS X, но это воспроизводимо и в Linux.

ОБНОВЛЕНИЕ II : Моя догадка оказалась верной, и если серверу и клиенту предоставляются отдельные объекты io_service, async_read видит байты в сокете. Это по-прежнему вызывает ошибку сегментации в boost :: asio :: detail :: kqueue_reactor :: post_immediate_completion , которая, кажется, происходит от io_service.run () . Прежде чем я продолжу, правильно ли использовать отдельные io_service объекты?

16
задан bitek 9 January 2013 в 08:33
поделиться