Почему закрытие клиентского сокета вызывает два события epoll?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Почему закрытие клиентского сокета вызывает два события epoll?

Сообщение Anonymous »

Похоже, что система epoll вызовет пару событий, если клиентский сокет отключится с помощью вызова функции close.
Я экспериментирую с коротким сервером и клиентом реализация на Python.
На стороне клиента, когда клиент вызывает

Код: Выделить всё

socket.close()
на стороне сервера возникает пара событий.
Эти события соответствуют EPOLLIN и EPOLLHUP.< /p>
Почему возникают оба события, а не одно событие EPOLLHUP?
Этот вопрос может показаться тривиальным или неважным, но это не так. потому что, если одновременно может быть вызвано более одного события, логика обработки таких событий становится сложной.
В битовой маске содержится примерно 10 различных типов событий. Предположительно, некоторые из них независимы. Однако в данном случае похоже, что EPOLLHUP подразумевает EPOLLIN.
Один из возможных способов написать логику для обработки событий epoll — это есть ряд операторов if, которые проверяют, установлен ли определенный бит.
Вот как это будет выглядеть:

Код: Выделить всё

if event & select.EPOLLIN:

if event & select.EPOLLHUP:

if event & select.EPOLLOUT:

...
Однако порядок операторов важен. Если мы сначала проверим EPOLLIN и обнаружим, что для чтения нет байтов данных, это говорит о том, что клиент отключился.
Если мы обработаем эту логику в первом if , то наш код сломается, поскольку второй оператор if также будет оценен как истинный.
Другой вариант может заключаться в более жесткой логике. Вот пример:

Код: Выделить всё

if event == (select.EPOLLIN & select.EPOLLHUP):

if event == (select.EPOLLIN):

...
Вероятно, это будет довольно хрупко, и охватить все возможные комбинации нереально.
Надеюсь, вопрос имеет смысл. Для обзора: почему сразу пара событий, особенно в этом случае, когда они оба имеют одинаковое значение. (Клиент отключился.)

Подробнее здесь: https://stackoverflow.com/questions/792 ... oll-events
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Почему закрытие клиентского сокета вызывает два события epoll?
    Anonymous » » в форуме Linux
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Сбой сокета сервера С# при отключении клиентского сокета во время отправки
    Anonymous » » в форуме C#
    0 Ответы
    47 Просмотры
    Последнее сообщение Anonymous
  • Получить имя процесса от клиентского сокета
    Anonymous » » в форуме C++
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Отмена токена отмены означает закрытие TCP-сокета.
    Anonymous » » в форуме C#
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Отмена токена отмены означает закрытие TCP-сокета.
    Anonymous » » в форуме C#
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»