Подтвердить что ты не робот

Как использовать EPOLLHUP

Не могли бы вы, ребята, предоставить мне хороший образец кода, используя EPOLLHUP для работы с мертвым пэром? Я знаю, что это сигнал для обнаружения отключения пользователя, но не уверен, как я могу использовать его в коде. Спасибо заранее.

4b9b3361

Ответ 1

Вы используете EPOLLRDHUP для обнаружения отключения сверстников, а не EPOLLHUP (который сигнализирует о неожиданном закрытии сокета, то есть обычно является внутренней ошибкой).

Использование его действительно просто, просто "или" флаг с любыми другими флагами, которые вы указываете на epoll_ctl. Так, например, вместо EPOLLIN напишите EPOLLIN|EPOLLRDHUP.

После epoll_wait выполните if(my_event.events & EPOLLRDHUP), а затем все, что вы хотите сделать, если другая сторона закрыла соединение (вы, вероятно, захотите закрыть сокет).

Обратите внимание, что получение результата с "нулевым байтом чтения" при чтении из сокета также означает, что другой конец отключил соединение, поэтому вы всегда должны его проверять, чтобы избежать неприятных сюрпризов (может появиться FIN после того, как вы проснулись от EPOLLIN, но прежде чем вы вызовете read, если вы находитесь в режиме ET, вы не получите другое уведомление).