TCP / IP - это надежный протокол потока байтов. Все ваши байты попадут в получатель, или вы получите сообщение об ошибке.
Индикация ошибки будет иметь вид закрытой розетки. Независимо от того, какой шаблон связи (кто отправляет), если байты не могут быть доставлены, сокет закроется.
Итак, вопрос в том, как вы видите закрытие сокета? Если вы никогда не читаете, вы в конечном итоге получите ошибку при попытке записи в закрытый сокет (с ECONNRESET errno, я думаю).
Если вам нужно поспать или подождать ввода для другого дескриптора файла, возможно, вы захотите подождать в вызове select (), где вы включаете сокет в список источников, на которых вы ожидаете (даже если Вы никогда не ожидаете получить что-нибудь). Если select () указывает, что сокет готов к вызову чтения, вы можете получить возврат -1 (думаю, с ECONNRESET). EOF будет означать упорядоченное закрытие (другая сторона сделала shutdown () или close ().
Как отличить эту ошибку при закрытии (например, при выходе из другой программы)? Ошибочных значений может быть достаточно, чтобы отличить ошибку от упорядоченного закрытия.
Если вам требуется однозначное указание на проблему, вам, вероятно, потребуется создать какой-то протокол уровня приложения выше уровня сокетов. Например, короткое «подтверждающее» сообщение, отправленное получателем обратно отправителю. Тогда нарушение этого прикладного протокола более высокого уровня (отправитель не видел подтверждения) будет подтверждением того, что это была ошибка закрытия по сравнению с чистым закрытием.