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