Еще один из продолжающейся саги о моем противостоянии с 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
объекты?