Conversation
| std::unique_ptr<char[]> buffer(new char[MAX_RESPONSE_SIZE]); | ||
|
|
||
| ssize_t ssize = 0; | ||
| while (ssize < MAX_RESPONSE_SIZE) { |
There was a problem hiding this comment.
Не понимаю логики работы. Если, например, read будет возвращать 0 или -1, то мы будем бесконечно вращаться в цикле.
There was a problem hiding this comment.
Будем врощаться до тех пор, пока не придет ответ, что кажется мне разумным.
Если Вам не сложно, объясните, пожалуйста, как Вы предлагаете обрабатывать ситуацию, когда read вернет 0 или -1.
There was a problem hiding this comment.
read равный 0 - соединение закрыто удаленной стороной, нужно закрывать клиент. read равный -1 - ошибка, выводим на экран сообщение и тоже выходим. Главное, как-то реагировать и выходить из цикла, потому что повторный вызов вернет тот же результат, и цикл продолжится.
Будем врощаться до тех пор, пока не придет ответ, что кажется мне разумным.
Ответ может прийти двумя частями. Т.е. не сразу 5 байт, а первый раз ssize = 3, а второй - ssize = 2. В обоих случаях цикл будет продолжать работать и считывать новую порцию данных. А потом сокет заблокируется, потому что он сейчас работает в блокирующем режиме. А потом когда-нибудь сервер отключится, клиент зависнет и будет потреблять 100% процессорного времени. Самый простой способ исправить это - написать ssize += read(...);, плюс обработать вариант с ssize <= 0.
No description provided.