Не могли бы вы, ребята, предоставить мне хороший образец кода, используя EPOLLHUP для работы с мертвым пэром? Я знаю, что это сигнал для обнаружения отключения пользователя, но не уверен, как я могу использовать его в коде. Спасибо заранее.
Как использовать EPOLLHUP
Ответ 1
Вы используете EPOLLRDHUP
для обнаружения отключения сверстников, а не EPOLLHUP
(который сигнализирует о неожиданном закрытии сокета, то есть обычно является внутренней ошибкой).
Использование его действительно просто, просто "или" флаг с любыми другими флагами, которые вы указываете на epoll_ctl
. Так, например, вместо EPOLLIN
напишите EPOLLIN|EPOLLRDHUP
.
После epoll_wait
выполните if(my_event.events & EPOLLRDHUP)
, а затем все, что вы хотите сделать, если другая сторона закрыла соединение (вы, вероятно, захотите закрыть сокет).
Обратите внимание, что получение результата с "нулевым байтом чтения" при чтении из сокета также означает, что другой конец отключил соединение, поэтому вы всегда должны его проверять, чтобы избежать неприятных сюрпризов (может появиться FIN
после того, как вы проснулись от EPOLLIN
, но прежде чем вы вызовете read
, если вы находитесь в режиме ET, вы не получите другое уведомление).