Но мой вопрос: почему также возвращается как доступный для записи?
Главное, что вы хотите сделать select()
, когда клиент отключился, - это немедленный возврат, так что ваш кодможет обнаружить событие отключения и обработать его КАК МОЖНО СКОРЕЕ (закрыв сокет).
Один из способов сделать это - обычный способ, когда сервер выбирает для чтения каждый сокет и когда клиентотключается, select()
вернет готовый для чтения на этом сокете, затем программа вызовет recv()
на сокете, чтобы узнать, что это за данные, recv()
вернет EOF, и сервер закроет сокет.Это все хорошо.
Теперь представьте себе менее распространенный (но не неслыханный) случай, когда сервер пишет в свои клиентские сокеты, но не хочет читать из них.В этом случае у сервера нет необходимости (или желания) выбирать готовые к чтению на своих сокетах;его нужно только выбрать для готовности к записи, чтобы знать, когда имеется некоторое пространство буфера исходящих данных для отправки дополнительных данных клиенту.Тем не менее, этот сервер должен знать, когда клиент отключился - вот почему отключенный сокет также выбирается как готовый к записи, так что select()
, который только наблюдает за готовностью к записи, также может обнаружитьи немедленно среагируйте на отключенную розетку.