Linux назвав сокет Howto


38

Я знаю, що в Linux є названі розетки та названі pipe (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 / мережу. Іменований файл сокета буде використовуватися двома процесами в одній системі.


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 () створює не названий сокет, який буде корисний лише з програми C.
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.
Тотор

1
Він похований у деталях веб-сайту socat, але у випадку, якщо це корисно, є синтаксис для обробки двох однонаправлених іменованих труб (fifo's) як єдиного двонаправленого блоку, який може бути з'єднаний з іншими двонаправленими об'єктами, такими як сокети Unix або TCP. Ви !!з'єднуєте названі труби за допомогою (socat 1.x) або %(socat 2.x), з написанням названої труби зліва та зчитуванням з названою трубою праворуч. наприкладsocat 'PIPE:/tmp/outstream!!PIPE:/tmp/instream' UNIX-CONNECT:/tmp/mysocket
Іван X

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

1

Немає засобу рядкового рядка для створення сокетів, оскільки сокет завжди підключається до сервера, який обробляє запити, надіслані до цього сокета.

Тож вам доведеться написати сервер і дозволити цьому створити сокет. Ось підручник .


Це все одно був би не названий сокет. Я хочу створити сокет, який би використовувався двома іншими процесами, як двостороння фіфо.
anishsane

Перевірте посилання у моїй відповіді. Тут показано, як налаштувати bind()підключення до"/home/beej/mysocket"
Aaron Digulla
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.