Половина отключения сокета приводит к тому, что epoll перестает получать события? - PullRequest
1 голос
/ 21 апреля 2019

Допустим, у меня есть модель клиента и сервера, связывающаяся друг с другом, и epoll настроен на стороне сервера для пробуждения при EPOLLIN и EPOLLOUT. Насколько я понимаю, изменение доступности клиентского конца сокета для чтения / записи вызовет событие epoll для запуска на сервере. Скажем, я делаю половину выключения на клиенте, поэтому я выключаю завершение записи клиента. Затем, как и ожидалось, я получаю событие EPOLLIN на стороне сервера. Однако теперь, скажем, я закрываю конец чтения сокета. epoll_wait не просыпается после этого. Я мог подумать, что, возможно, происходит то, что, как только конец записи клиента закрывается, он не может отправить на сервер уведомление о том, что он закрывает конец чтения. С другой стороны, я думал, что наличие EPOLLOUT сообщит мне о любых изменениях в состоянии конца чтения клиента / конца записи сервера, но это не так.

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

1 Ответ

0 голосов
/ 01 мая 2019

Сервер не получит уведомление, когда клиент закроет свою «конец чтения».

Вместо этого, когда сервер обнаружил, что клиент закрыл свою «конец записи», сервер должен затем решить, когда онзакончит запись данных, а затем закроет собственный «конец записи».Это полностью закроет TCP-соединение.

Если вы обеспокоены тем, что сервер может преждевременно закрыть соединение до того, как клиент прочитает все отправленные данные, об этом позаботится TCP.Пакет FIN, связанный с закрытием «конца записи», ставится в очередь за пакетами данных, которые были отправлены раньше него.Пока клиент обрабатывает данные с сервера с последовательными вызовами на recv, возвращаемое значение 0 будет указывать, что все доступные данные были прочитаны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...