2009-07-06 2 views
0

Мне нужна помощь, чтобы понять специфическую проблему, возникающую при использовании asio.boost asio: 0 байт написать

У меня есть приложение клиент-сервер с клиентом C++ (с использованием boost asio), отправляющим 2 байта (например, каждую секунду) на сервер (написанный в java) (и получение большого количества данных).

В течение нескольких минут сервер правильно получает 2-байтовый HeartBeat, но после этого «прочитанный» сервер жалуется на чтение 0 байта и закрывает соединение (что, я думаю, правильно для чтения блокировки). Клиент, однако, всегда печатает, что он передавал правильную сумму.

Я экспериментировал практически со всеми вариантами семейства функций «написать». все они реализованы с точки зрения «write_some», и означает ли это, что такое поведение ожидается?

Должно быть, я ошибаюсь в своем использовании, в основном я ищу что-то внутри asio, которое гарантирует запись (по крайней мере, байт). пожалуйста, помогите мне выяснить, где я ошибаюсь (и если какая-либо дополнительная информация является обязательной.) ... любой совет, наиболее ценимый! спасибо!

ответ

1

Если это розетки, вы не можете «гарантировать запись»; что, если сеть не работает, кабель выдернут, выключатель горит, или питание отключено во всем мире, и ваш компьютер, как правило, работает только на аккумуляторах?

Таким образом, кажется, что у вас есть какая-то проблема буферизации/опорожнения, возможно, проверьте свой прочитанный код, чтобы убедиться, что он действительно потребляет все данные, которые появляются.

0-байтовое чтение не является ошибкой, снова просмотрите этот код, проверьте флаги состояния ошибки на сокетах и ​​т. Д. Чтение может завершиться неудачей со статусом «AGAIN», что на самом деле означает, что вы должны попробовать еще раз.

+0

Hi Unwind, спасибо за ваш ответ. «Чтение» находится на сервере java, и, перейдя по коду, оно похоже на классический «select», за которым следует («блокировка») «чтение» (я думал, что EAGAIN был только в том случае, если неблокирование было задавать) . у всех других клиентов Java нет проблем. Я немного запутался в 0 байт, прочитав «нормальный» блокирующий вызов чтения (все книги n/w и документы упоминают чтение <= 0 как eof/failure). , в то время как блокирующая запись может быть короткой (а не tfr все байты за один раз), может ли он когда-либо отправлять 0 tcp полезную нагрузку? – 2009-07-06 09:20:08

+0

read return 0 - довольно стандартный способ сказать, что «другой конец закрыл tcp-соединение». Проверьте его, например. сетевой монитор, такой как wirehark. – nos

1

strace Приложения с обоих концов. Он покажет любые коды ошибок, возвращаемые , прочитайте(), напишите() и т.д. Используйте strace -f, если приложение многопоточно.

Преимущество этого подхода в том, что все приложения - java, C++, python одинаковы в strace, поэтому легко обнаружить плохое поведение.

В этом случае, вероятно, будет показано, что соединение tcp завершено (изящно).

Смежные вопросы