Можно ли проверить, был ли отключен неблокирующий сокет? - PullRequest
0 голосов
/ 24 мая 2018

Я хочу проверить, жив ли сокет, прежде чем пытаться читать с него, но похоже, что recv () и read () вернут 0 независимо.Согласно справочной странице:

Когда узел сокета потока выполнил упорядоченное завершение, возвращаемое значение будет 0 (традиционный возврат в конце файла).

Но также:

Значение 0 также может быть возвращено, если запрошенное число байтов для получения из сокета потока было 0.

Как мнеразличать эти два случая?И если это невозможно, есть ли другой способ узнать, был ли сокет выключен / закрыт?

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Ничего из вышеперечисленного не является правильным ответом.

Неблокирующий сокет вернет -1 и установит errno == EAGAIN ||errno == EWOULDBLOCK, если просто нет новых данных.В случае постепенного отключения соединения удаленным узлом recv вернет 0.

0 голосов
/ 24 мая 2018

Позвоните recv() с ненулевым length и флагом MSG_PEEK.Затем проверьте, является ли возвращаемое значение 0.Использование MSG_PEEK предотвратит использование этой информации любыми данными - следующая recv() будет читать ее снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...