Skip to content

Conversation

@ottergottaott
Copy link

No description provided.

std::unique_ptr<char[]> buffer(new char[MAX_RESPONSE_SIZE]);

ssize_t ssize = 0;
while (ssize < MAX_RESPONSE_SIZE) {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не понимаю логики работы. Если, например, read будет возвращать 0 или -1, то мы будем бесконечно вращаться в цикле.

Copy link
Author

@ottergottaott ottergottaott Mar 27, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Будем врощаться до тех пор, пока не придет ответ, что кажется мне разумным.

Если Вам не сложно, объясните, пожалуйста, как Вы предлагаете обрабатывать ситуацию, когда read вернет 0 или -1.

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

read равный 0 - соединение закрыто удаленной стороной, нужно закрывать клиент. read равный -1 - ошибка, выводим на экран сообщение и тоже выходим. Главное, как-то реагировать и выходить из цикла, потому что повторный вызов вернет тот же результат, и цикл продолжится.

Будем врощаться до тех пор, пока не придет ответ, что кажется мне разумным.

Ответ может прийти двумя частями. Т.е. не сразу 5 байт, а первый раз ssize = 3, а второй - ssize = 2. В обоих случаях цикл будет продолжать работать и считывать новую порцию данных. А потом сокет заблокируется, потому что он сейчас работает в блокирующем режиме. А потом когда-нибудь сервер отключится, клиент зависнет и будет потреблять 100% процессорного времени. Самый простой способ исправить это - написать ssize += read(...);, плюс обработать вариант с ssize <= 0.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants