Может ли poll() возвращать событие POLLIN даже после того, как партнер повесил трубку?

Я вижу, что системный вызов poll() возвращает событие POLLIN даже после того, как одноранговый узел был закрыт сокетом. Я вижу и ПОЛЛИН, и ПОЛЛЕРР. И это продолжает происходить даже после того, как вызов read() вернул -1.

Моя логика обрабатывает POLLERR, только если нет POLLIN, чтобы удостовериться, что я прочитал все пакеты, которые уже прибыли до того, как сокет был отключен. В результате я никогда не заканчиваю работу с POLLERR, так как POLLIN всегда установлен.

Почему poll() возвращает POLLIN вместе с POLLERR после ошибки сокета? И как мне справиться с этим сценарием.

Спасибо!

1 ответ

Реальный вопрос здесь заключается в том, почему вы все еще опрашиваете сокет, и действительно, почему он все еще существует? Если вы получили -1 от read() Вы должны были закрыть сокет и удалить его из набора опросов. Если ты этого не сделаешь, POLLIN повторится навсегда.

Другие вопросы по тегам