UNIX-сокет домена:Существует ли такое понятие, как сигнал «занято»?
-
16-09-2019 - |
Вопрос
Может ли Клиент передача данных через сокет домена UNIX (тип AF_UNIX) должна быть сигнализирована занятый если принимающая сторона не справится с нагрузкой?
ИЛИ
Должен ли быть протокол клиент-сервер поверх сокета для управления потоком?
Решение
Если вы не включите это в протокол, сервер не сможет сообщить клиенту, чтобы он приостановил отправку информации.
Другие советы
Вы определенно можете выполнить блокирующую отправку в сокет домена UNIX.Если буфер приема принимающей стороны заполнен или если количество ожидающих (недоставленных) буферов сокета отправки слишком велико, отправитель заблокируется.
SOCK_STREAM Доменные сокеты UNIX работают как TCP-сокеты.SOCK_DGRAM Сокеты домена UNIX работают аналогично UDP, за исключением того, что дейтаграммы домена UNIX гарантируют доставку в определенном порядке, тогда как сокеты UDP можно переупорядочивать или удалять.(Кроме того, сокеты домена UNIX можно использовать для отправки дескрипторов файлов и передачи учетных данных пользователя между процессами, но ни то, ни другое невозможно сделать с помощью TCP, UDP или каналов.)
Таким образом, поскольку доставка по порядку гарантируется всеми типами доменных сокетов UNIX, получатель может просто прекратить прием, когда он занят другими делами, а отправитель будет автоматически заблокирован, когда в буфере больше не будет свободного места (или будет уведомлен что буферного пространства больше нет, если они запросили неблокирующую операцию в своем сокете).Затем, когда получатель снова начнет получать, отправителю будет разрешено отправлять больше.
Кроме того, что сервер имеет некоторую информацию о том, когда он «занят», и отправляет обратно определенный сигнал (например,Служба HTTP 503 недоступна).Вы также можете настроить соединение на стороне клиента на таймаут через определенный промежуток времени, и если вы получите событие таймаута, интерпретируйте это как занятость сервера.