Когда recv
возвращает значение 0, что означает, что соединение было закрыто.
См. Справочную страницу recv
:
ЭтиCall возвращает количество полученных байтов или -1, если произошла ошибка.Возвращаемое значение будет равно 0, когда одноранговый узел выполнил упорядоченное завершение работы.
В ответе на вопрос № 1 да сокет теперь недействителен.Вы должны создать новый сокет и соединение для дальнейшей связи.
Редактировать
Теперь, как указал Вальдо ниже, существует также возможность иметь полузакрытое TCP-соединение, по которому вы больше не можете получать, кроме вас.можете продолжать запись в сокет, пока вы не закончите отправку своих данных.См. Эту статью для более подробной информации: TCP Half-Close .Это не похоже на то, что у вас такая ситуация.
В ответе на вопрос № 2, в основном, есть два способа обнаружить закрытую розетку.Это предполагает, что сокет прошел упорядоченное завершение работы, то есть одноранговый узел с именем shutdown
или close
.
Первый метод - чтение из сокета, в этом случае вы получаете возвращаемое значение 0.Другой метод заключается в записи в сокет, что приведет к генерации сигнала SIG_PIPE, указывающего на сломанную трубу.
Чтобы избежать сигнала, вы можете установить опцию MSG_NOSIGNAL
socket, в этом случае send
вернет -1 и установит errno
в EPIPE
.