Ответ 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
).