По крайней мере, для некоторых стеков, полученных из BSD, с которыми я работал, вы можете проверить, закрылся ли другой конец, используя getpeername (). При поддержке стеков это вернет -1 и установит ENOTCONN, если другой конец закрыл свою половину соединения.
Это позволяет вам запрашивать, вызвал ли другой конец close (), без необходимости вызова чтения с сокета. Вопреки тому, что было сказано ранее, это можно узнать из стека IP, не инициируя какое-либо соединение с другим концом, поскольку стек IP получает уведомление FIN, когда другой конец закрывает свою половину соединения. Эта информация может затем использоваться стеком для уведомления будущих абонентов getpeername () о том, что другой конец закрыт.