2009-09-25 3 views
2

Может ли Клиент передавать данные через гнездо домена UNIX (тип AF_UNIX) занят, если принимающая сторона не может справиться с нагрузкой?UNIX-доменный сокет: есть ли такая вещь, как «занятый» сигнал?

ИЛИ

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

ответ

0

Если вы не включили это в протокол, сервер не может сообщить клиенту о приостановке отправки информации.

+0

Таким образом, сокеты являются FIFO без контроля потока: для управления потоком необходим (требуется) протокол верхнего уровня (при необходимости). – jldupont

+0

TCP/IP не слишком много знает. Написание обработчика управляющих сообщений (вы должны их написать тоже) - единственный способ сделать это. – Alex

+2

@ Жан-Лу: это правильно. 'AF_UNIX' не обеспечивает абсолютно никакой семантики управления потоком. Основное устройство может предоставлять условия переполнения буфера, что приведет к 'send()' возврату ошибки, но это специфично для устройства. –

-2

Кроме сервера, имеющего некоторые знания о том, когда он «занят» и отправляет конкретный сигнал (например, HTTP-служба 503 недоступна). Вы также можете настроить подключение на стороне клиента к таймауту через определенный промежуток времени, а если вы получите событие тайм-аута, интерпретируйте его как занятый сервер.

+0

... и это поведение является общим для сокетов в целом * или * для AF_INET? (Я спрашиваю из-за вашего примера, используя HTTP) – jldupont

+0

PS ETIMEDOUT - это то, что вы получили бы от вызова сокета connect, если он не смог установить соединение в течение заданного времени таймаута; setockopt SO_SNDTIMEO со временем - это то, как вы это настроили (если вы не хотите использовать по умолчанию). – AlBlue

+1

Снова, хозяин, возможно, действительно опустился. Наличие вашего клиента в таком состоянии очень неверно для тех, кто контролирует процесс. (при условии, что это критически важно) – Alex

8

Вы можете сделать блокировку отправки в UNIX-домен. Если буфер приема принимающей стороны заполнен, или если количество незанятых (недопустимых) отправленных буферов сокетов слишком велико, отправитель будет блокироваться.

SOCK_STREAM Разделы домена UNIX работают как TCP-сокеты. SOCK_DGRAM Домены домена UNIX работают подобно UDP, за исключением того, что дейтаграммы домена UNIX гарантируют доставку по заказу, тогда как сокеты UDP могут быть перенаправлены или удалены. (Кроме того, UNIX Domain Sockets можно использовать для отправки файловых дескрипторов и передачи учетных данных пользователя между процессами, ни один из которых не может выполняться с помощью TCP, UDP или труб.)

Так, поскольку доставка в порядке гарантирована всеми типы UNIX-доменных сокетов, приемник может просто прекратить прием, когда он занят другими вещами, и отправитель будет автоматически заблокирован, когда свободного места в буфере нет (или будет уведомлено о том, что свободного места в буфере нет, -блокировка на своем гнезде). Затем, когда приемник снова начнет прием, отправителю будет разрешено отправлять больше.

+0

Есть ли способ использовать XON/XOFF? – CMCDragonkai

+0

Вы можете использовать любой протокол, который вы хотите, сверху, и который может включать отправку символов XON/XOFF. Но ядро ​​не будет делать с ними ничего особенного. Он просто передает их, как любой другой байт. – jtchitty

Смежные вопросы