Вызов recv возвращает 0 против события POLLHUP в опросе C
(В программировании сокетов C, используяpoll
для управления fd и его событиями)
с сокетом потока данных, возвращенным изaccept()
call, в чем разница между событием POLLHUP и получением 0 при вызове recv(fd, ...)? Оба они, кажется, указывают на то, что соединение было закрыто с другого конца, но я хотел знать, есть ли какая-либо техническая разница между ними.
1 ответ
вrevents
изstruct pollfd
сообщает вам, был ли закрыт другой конец трубы или розетки. Это означает, что вы не можете писать в дескриптор (если он открыт для записи), не получивSIGPIPE
, но все еще могут быть данные, ожидающие чтения (если они открыты для чтения). После того, как все оставшиеся байты будут прочитаны, будут выполняться такие функции, какrecv(2)
иread(2)
вернет 0.
ОбаPOLLIN
и, таким образом, может быть установлен одновременно, но неPOLLOUT
иPOLLHUP
- эти два взаимоисключающие.