Как мне изящно закрыть свой сервер? - PullRequest
3 голосов
/ 27 мая 2011

У меня есть сервер, который слушает stdin (пользователя) и других клиентов.

Допустим, сервер подключен ко многим клиентам (используя select для управления всеми файловыми дескрипторами), и пользователь вводит EXIT в терминале. Это означает, что сервер должен сам закрыться.

Как правильно изящно закрыть сервер? Должен ли сервер просмотреть все файловые дескрипторы и close(fd) все они или просто закрыть listener fd? Или я не должен закрывать что-либо и просто завершать и завершать процесс на сервере?

Я использую только одну ветку в моей программе.

Спасибо.

Ответы [ 2 ]

4 голосов
/ 27 мая 2011

Закрытие слушателя fd означает, что больше никаких соединений не будет принято.Самый лучший способ справиться с этим:

  • Прекратить принимать соединения
  • Сказать всем закрыть (через ваш протокол)
  • Подождите некоторое время, а затем закройтесервер

Закрытие процесса автоматически закрывает все его открытые дескрипторы файлов.Говорить всем о том, что нужно закрыть перед выходом, просто для удобства, чтобы не внезапно закрыть соединение.

2 голосов
/ 27 мая 2011

Для «изящного разъединения» вы также должны вызвать shutdown(fd, SHUT_RDWR); ( shutdown () ), чтобы вы могли убедиться, что все данные отправлены и получены до того, как вы закроете () сокет.*

Кстати, если вы работаете в Linux, вы можете использовать epoll вместо select.

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