Я пытаюсь проверить закрытый сокет, который был изящно закрыт узлом, не вызывая задержку двойного посыла, чтобы вызвать SIGPIPE
.
Одним из предположений здесь является то, что сокет, если он закрыт, был изящно закрыт партнером сразу после его последней записи / отправки. Фактические ошибки, такие как преждевременное закрытие, рассматриваются в другом месте кода.
Если сокет все еще открыт, будет 0 или более байтовых данных, которые я на самом деле не хочу извлекать из буфера сокетов.
Я думал, что мог бы позвонить int ret = recv(sockfd, buf, 1, MSG_DONTWAIT | MSG_PEEK);
, чтобы определить, подключен ли сокет. Если он подключен, но в буфере нет данных, я получу возврат -1
с errno == EAGAIN
и верну sockfd для повторного использования. Если это было изящно закрыто узлом, я получу ret == 0
и открою новое соединение.
Я проверял это, и , кажется, работает. Тем не менее, я подозреваю, что есть небольшое окно между тем, когда я получаю последний бит моих данных и когда приходит одноранговый узел FIN
, в котором я могу получить ложноположительный результат EAGAIN
из своего теста recv
.
Это меня укусит, или есть лучший способ сделать это?