Подтвердить что ты не робот

Как Unix Domain Sockets различают несколько клиентов?

TCP имеет пары кортежей (IP Addr/port/type), чтобы передать один клиент из другого. UDP передает клиентский IP-адрес и порт. Как домен unix отслеживает разные клиенты?

Другими словами, сервер создает сокет, привязанный к некоторому пути say/tmp/socket. 2 или более клиентов подключаются к /tmp/socket. Что происходит под этим, что отслеживает данные от client1 и client2? Я полагаю, что сетевой стек не играет роли в сокетах домена, так что ядро ​​делает всю работу здесь?

Существует ли формат протокола unix-домена, например, формат протокола IP и форматы TCP/UDP? Является ли формат протоколов дейтаграмм доменных сокетов? Является ли каждый unix другим или что-то вроде POSIX стандартизирует его?

Спасибо за любое освещение. Я не мог найти никакой информации, которая объясняла это. Каждый источник просто замалчивается, как использовать сокеты домена.

4b9b3361

Ответ 1

Если вы создаете сокет PF_UNIX типа SOCK_STREAM и принимаете соединения на нем, то каждый раз, когда вы принимаете соединение, вы получаете новый дескриптор файла (в качестве возвращаемого значения системного вызова accept), Этот файловый дескриптор считывает данные и записывает данные в дескриптор файла в клиентском процессе. Таким образом, он работает так же, как TCP/IP-соединение.

Нет никакого формата протокола unix домена. Там не обязательно, потому что сокет Unix-домена нельзя подключить к одноранговому сетевому соединению. В ядре дескриптор файла, представляющий ваш конец сокета SOCK_STREAM Unix-domain, указывает на структуру данных, которая сообщает ядру, какой файловый дескриптор находится на другом конце соединения. Когда вы записываете данные в дескриптор файла, ядро ​​просматривает дескриптор файла на другом конце соединения и добавляет данные в этот буфер чтения дескриптора другого файла. Ядру не нужно помещать свои данные в пакет с заголовком, описывающим его назначение.

Для сокета SOCK_DGRAM вы должны указать ядру путь сокета, который должен получать ваши данные, и он использует это для поиска дескриптора файла для этого приемного сокета.

Если вы связываете путь к своему клиентскому соку перед подключением к сокету сервера (или перед отправкой данных, если вы используете SOCK_DGRAM), тогда серверный процесс может получить этот путь, используя getpeername (для SOCK_STREAM). Для SOCK_DGRAM принимающая сторона может использовать recvfrom, чтобы получить путь к отправляющему сокету.

Если вы не привязываете путь, то процесс получения не может получить идентификатор, который однозначно идентифицирует одноранговую сеть. По крайней мере, не на ядре Linux, в котором я работаю (2.6.18-238.19.1.el5).