Linux назвал сокеты howto

38

Я знаю, что в Linux есть именованные сокеты и именованные каналы (fifo).

В ls -l, они будут выглядеть как показано ниже: (Я изменил имена файлов, для демонстрации.)

prw-r--r-- 1 root root 0 Nov  8 16:31 /tmp/fifo
srwxrwxrwx 1 root root 0 Nov  8 15:54 /tmp/socket

Теперь именованный канал может быть создан с помощью mkfifo. Есть ли команда для создания именованного сокета?

Последний вариант - написать программу на C, которая будет вызывать функцию mknod, но хотела бы знать, есть ли уже команда для этого.

Что я пробовал:
я пытался найти какие-либо параметры для mknod & mkfifo, но не смог найти.

ПРИМЕЧАНИЕ. Я не обсуждаю модель сервер-клиент по сети Ethernet. Именованный файл сокета будет использоваться двумя процессами в одной системе.

anishsane
источник
2
Просто примечание: у меня есть 2 процесса - qemu и virsh, которые могут общаться друг с другом, используя именованный сокет (согласно моему пониманию, основанному на документации), но я не знаю, как создать именованный сокет. Хотя есть другие варианты использования virsh с qemu, я искал вариант, в котором я мог бы присоединить virsh к существующему процессу qemu, и ему нужен именованный сокет при запуске процесса qemu. По имени Фиво не работает. Кроме того, я думаю, будет интересно узнать, как создать именованный сокет, если это потребуется позже.
Anishsane

Ответы:

24

Файл сокетов Unix / Linux - это, по сути, двусторонний FIFO. Поскольку сокеты изначально были созданы как способ для управления сетевыми соединениями, можно манипулировать ими с помощью send()и recv()системных вызовов. Тем не менее, в духе Unix «все является файлом», вы также можете использовать write()и read(). Вам нужно использовать socketpair()илиsocket() для создания именованных сокетов. Руководство по использованию сокетов в C можно найти здесь: Руководство Beej по Unix IPC: Unix Sockets .

socatУтилита командной строки полезно , если вы хотите играть с розетками без написания «реальной» программы. Он похож netcatи действует как адаптер между различными сетевыми и файловыми интерфейсами.

Ссылки:

Йоаким Нольгорд
источник
1
socketpair () или socket () создает неназванный сокет, который будет полезен только из программы на Си.
Anishsane
Было бы интересно проверить, возможно ли создать именованный сокет, используя socat. Возможно, создайте неназванный сокет, свяжите его с localhost: some_port и затем используйте socat с этим портом?
Anishsane
3
Можно создать именованные сокеты с socatпомощью команды UNIX-LISTEN, см. man socatИли это руководство по HTML
Joakim Nohlgård
1
Я попытался это быстрая и грязная команда и создал файл сокет f1: socat UNIX-LISTEN:f1 LISTEN:f2.
Totor
1
Он скрыт в деталях сайта socat, но в случае его полезности есть синтаксис для обработки двух однонаправленных именованных каналов (fifo's) как единой двунаправленной единицы, которую можно соединить с другими двунаправленными сущностями, такими как Unix или сокеты TCP. Вы соединяете именованные каналы с !!(socat 1.x) или %(socat 2.x), с написанием именованного канала слева и чтением именованного канала справа. напримерsocat 'PIPE:/tmp/outstream!!PIPE:/tmp/instream' UNIX-CONNECT:/tmp/mysocket
Иван Икс
17

Создайте сокет быстро в Python:

~]# python -c "import socket as s; sock = s.socket(s.AF_UNIX); sock.bind('/tmp/somesocket')"
~]# ll /tmp/somesocket 
srwxr-xr-x. 1 root root 0 Mar  3 19:30 /tmp/somesocket

Или с крошечной C-программой , например, сохраните следующее в create-a-socket.c:

#include <fcntl.h>
#include <sys/un.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    // The following line expects the socket path to be first argument
    char * mysocketpath = argv[1];
    // Alternatively, you could comment that and set it statically:
    //char * mysocketpath = "/tmp/mysock";
    struct sockaddr_un namesock;
    int fd;
    namesock.sun_family = AF_UNIX;
    strncpy(namesock.sun_path, (char *)mysocketpath, sizeof(namesock.sun_path));
    fd = socket(AF_UNIX, SOCK_DGRAM, 0);
    bind(fd, (struct sockaddr *) &namesock, sizeof(struct sockaddr_un));
    close(fd);
    return 0;
}

Затем установите gcc, скомпилируйте его и выполните команду ta-da:

~]# gcc -o create-a-socket create-a-socket.c
~]# ./create-a-socket mysock
~]# ll mysock
srwxr-xr-x. 1 root root 0 Mar  3 17:45 mysock
rsaw
источник
1

Нет инструмента командной строки для создания сокетов, так как сокет всегда подключен к серверу, который обрабатывает запросы, отправленные на этот сокет.

Так что вам придется написать сервер и позволить этому создать сокет. Вот учебник .

Аарон Дигулла
источник
Это все равно будет безымянный сокет. Я хочу создать сокет, который будет использоваться двумя другими процессами, как двунаправленный fifo.
Anishsane
Проверьте ссылку в моем ответе. Он показывает, как настроить bind()подключение к"/home/beej/mysocket"
Аарон Дигулла