Обнаружение, когда ServerSocketChannel закрывается, когда в selector.select () - PullRequest
0 голосов
/ 20 февраля 2019

Когда у меня есть selector.select (), зарегистрированный в SocketChannel, и я закрываю одноранговый узел SocketChannel в отдельном потоке, selector.select () возвращается, и устанавливается операция READ этого канала.Если у меня есть ServerSocketChannel, зарегистрированный для селектора, и я закрываю ServerSocketChannel, selector.select () не возвращается.В любом случае я могу обнаружить, что ServerSocketChannel был закрыт, в то время как был заблокирован в selector.select ()?

Я попытался использовать selector.wakeup () и просмотреть набор ключей (не выбранных ключей) и проверить, есть ли в наборе какие-либо нераскрытые каналы, но как только закрытие будет выполнено наServerSocketChannel, он отменен из селектора, поэтому его нет в наборе select.keys ().

1 Ответ

0 голосов
/ 21 февраля 2019

Есть ли в любом случае, я могу обнаружить, что ServerSocketChannel был закрыт во время блокировки в selector.select ()?

Если вы хотите, чтобы selector.select() возвращался, чтобы вы могли извлечь закрытый каналв выбранных ключах то нет.Как сказано в документации

Возвращается только после того, как выбран хотя бы один канал, вызывается метод пробуждения этого селектора или прерывается текущий поток, в зависимости от того, что наступит раньше.

Поскольку существует нет такой интерес, как, например, OP_CLOSE, единственный способ заставить select возвращать метод при закрытии канала - это явно wakeup.Но ключ неявно отменяется.

В любом случае, это не так уж много, что вы можете сделать с закрытым каналом.

Также EPollSelectorProvider передает вызовы на базовый epoll, и это неесть событие, как вы хотите либо.http://man7.org/linux/man-pages/man2/epoll_ctl.2.html

...