Мне нужна помощь, чтобы понять специфическую проблему, возникающую при использовании asio.boost asio: 0 байт написать
У меня есть приложение клиент-сервер с клиентом C++ (с использованием boost asio), отправляющим 2 байта (например, каждую секунду) на сервер (написанный в java) (и получение большого количества данных).
В течение нескольких минут сервер правильно получает 2-байтовый HeartBeat, но после этого «прочитанный» сервер жалуется на чтение 0 байта и закрывает соединение (что, я думаю, правильно для чтения блокировки). Клиент, однако, всегда печатает, что он передавал правильную сумму.
Я экспериментировал практически со всеми вариантами семейства функций «написать». все они реализованы с точки зрения «write_some», и означает ли это, что такое поведение ожидается?
Должно быть, я ошибаюсь в своем использовании, в основном я ищу что-то внутри asio, которое гарантирует запись (по крайней мере, байт). пожалуйста, помогите мне выяснить, где я ошибаюсь (и если какая-либо дополнительная информация является обязательной.) ... любой совет, наиболее ценимый! спасибо!
Hi Unwind, спасибо за ваш ответ. «Чтение» находится на сервере java, и, перейдя по коду, оно похоже на классический «select», за которым следует («блокировка») «чтение» (я думал, что EAGAIN был только в том случае, если неблокирование было задавать) . у всех других клиентов Java нет проблем. Я немного запутался в 0 байт, прочитав «нормальный» блокирующий вызов чтения (все книги n/w и документы упоминают чтение <= 0 как eof/failure). , в то время как блокирующая запись может быть короткой (а не tfr все байты за один раз), может ли он когда-либо отправлять 0 tcp полезную нагрузку? – 2009-07-06 09:20:08
read return 0 - довольно стандартный способ сказать, что «другой конец закрыл tcp-соединение». Проверьте его, например. сетевой монитор, такой как wirehark. – nos