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