Вы должны тщательно проверить возвращаемое значение read
.Он может вернуть любую из трех вещей:
Положительное число, указывающее, что некоторые байты были прочитаны.
Ноль, указывающее, что другой конец изящно закрыл соединение.
-1, что означает, что произошла ошибка.(Если сокет неблокирующий, то ошибка EAGAIN или EWOULDBLOCK означает, что соединение все еще открыто, но данные для вас сейчас не готовы, поэтому вам нужно подождать, пока epoll
сообщит, что для вас есть больше данных.)
Если ваш код не проверяет каждую из этих трех вещей и обрабатывает их по-разному, то он почти наверняка не работает.
Они охватывают все случаи, о которых вы спрашиваете, например, отправка клиентом90 байтов, затем закрытие или грубое разрыв соединения (потому что read () вернет 0 или -1 для этих случаев).
Если вы беспокоитесь, что клиент может отправить 90 байтов, а затем никогда больше не отправлять, иНикогда не закрывайте соединение, тогда вы должны установить свои собственные тайм-ауты.Для этого лучше всего ставить неблокирующие сокеты и устанавливать таймаут на select () / poll () / epoll (), отключая соединение, если оно простаивает слишком долго.