First Boost async_read не вызывается - PullRequest
1 голос
/ 14 апреля 2020

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

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

Пожалуйста, см. изменения в исходном файл , который делает клиент доступным для чтения.

Это результат, когда клиент подключен и отправляет данные на сервер:

Verifying /C=AU/ST=Some-State/O=Internet Widgits Pty Ltd
Enter message: 1234567890
Enter message: aaaaaaaaaa
Enter message: bbbbbbbbbb
Reply: 1234567890
Enter message: cccccccccc
Reply: aaaaaaaaaa
Enter message: dddddddddd
Reply: bbbbbbbbbb
Enter message:

Редактировать: Я проверил больше ситуаций и получил новые результаты. Я изменил код, чтобы в функции завершения async_write метод send_request() больше не запускался (поэтому мы не будем получать новые данные от пользователя для отправки). Пожалуйста, смотрите изменения в этом патче . Результаты выглядят следующим образом:

1 Verifying /C=AU/ST=Some-State/O=Internet Widgits Pty Ltd
2 Enter message: 1234567890
3 Reply: 1234567890
4 Read failed: stream truncated          <--- Server closed at this point

В строке 4 происходит ожидание чтения, и, как вы можете видеть, async_read лямбда вызвала и отобразила результат ошибки (поскольку сервер был закрыт вручную). До сих пор я понял, что второй async_write (тот, который вызывается в результате вызванной лямбды) делает первый async_read снятым (или что-то подобное).

...