LINUX.ORG.RU

Чем локальные сокеты отличаются от пайпов ?


0

1

«Сокеты UNIX (по новому это локальные сокеты) используются для межпроцессного взаимодействия на одном хосте. Адресом такого сокета является путь в файловой системе.»

Что-то мне непонятно, как они работают. А чем они отличаются от сокетов на loopback-интерфейсе ?

Именно тем и отличается, что адресом именованного сокета служит путь в файловой системе.

PolarFox ★★★★★
()

Чем локальные сокеты отличаются от пайпов

с пайпами работают через «mknod/open/read/write», а с сокетами - «socket/bind/connect/accept/send(|to|msg)/recv(|from|msg)». Первое проще и костыльнее, второе богаче и универсальнее. Похоже,

mknod = (socket=>>bind=>>close)/2
open(O_RDONLY) = (socket =>> bind)/2
open(O_WRONLY) = (socket =>> bind =>> (connect|accept))/2
write = (send(,,,CONST))
read аналогично.
а в обратную сторону всё сильно хуже. Т.ч. я бы сказал, что первое - костыль, слабофункциональная смесь независимых сущностей. «/2» потому, что сокеты сразу двунаправленные.

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot

DonkeyHot> КАК? Очень нужно, но до сих пор не находилось.

Он явно путает сокеты и пайпы, но для тебя у меня есть socat — одно из назначений — socat can be used ... as a shell interface to UNIX sockets ...

sdio ★★★★★
()

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

Eshkin_kot ★★
()

Пайп ориентирован на взаимодействие только двух приложений (один клиент и сервер, нет понятия «соединение») и обычно только в одном направлении. Юникс сокет имеет «полноценный» интерфейс сокета и может обслуживать множество клиентов, в двух направлениях.

А чем они отличаются от сокетов на loopback-интерфейсе ?

lo автоматически подразумевает использование сетевых протоколов для передачи данных типа IP. Соответственно просто сокет на lo «прогоняет» трафик через сетевой стек значительно увеличивая нагрузку на систему. Хотя это может быть ОС-зависимо.

mashina ★★★★★
()

А еще юникс сокеты значительно быстрее петли.

OxiD ★★★★
()

Пайпы могут передавать данные только в одну сторону, поэтому используются только для организации конвейеров типа producer(s)->[pipe]->consumer(s). Если несколько процессов пишут данные в один пайп, их данные помещаются в пайп без каких либо разделителей, поэтому, чтобы отличать сообщения, записанные разными процессами друг от друга надо вводить какое-то кадрирование (то есть каждое сообщение должно содержать свою длину). Но запись в пайп более 4096 байт производится неатомарно, поэтому при записи в пайп больших сообщений несколькими процессами сообщения бьются на куски куски перемешиваются и кадрирование ломается. Всё это из-за того, что с пайпом в ядре связан один буфер фиксированного размера (обычно 4096 байт).

Сокеты могут передавать данные в обе стороны, поэтому используются для организации соединений типа client<->[socket]<->server. Системный вызов accept() создаёт отдельный сокет для каждой пары клиент-сервер, поэтому перемешивание сообщений от разных клиентов исключено.

Кроме того, локальные сокеты могут использоваться для передачи unix-специфичной информации между процессами. Можно узнать идентификаторы пользователя и групп, с которыми запущен процесс на другом конце сокета (например, сервер может обслуживать только клиентов, принадлежащих определённой unix-группе). Также можно передавать между процессами файловые дескрипторы (например, сервер запущенный с одними правами, может открыть файл и передать дескриптор этого файла клиенту, запущенному с другими правами).

iliyap ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.