Как я могу использовать EPOLLHUP - PullRequest
20 голосов
/ 22 июня 2011

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

1 Ответ

34 голосов
/ 22 июня 2011

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

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

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

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

...