Linux nommé sockets howto

38

Je sais qu'il existe des sockets et des tubes nommés (fifo) dans Linux.

Dans ls -l, ils ressembleraient à ce qui suit: (J'ai changé les noms de fichiers, par démonstration.)

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

Maintenant, un canal nommé peut être créé avec mkfifo. Existe-t-il une commande pour créer un socket nommé?

La dernière option serait d'écrire un programme C, qui appellerait la fonction mknod, mais je voulais savoir s'il y avait déjà une commande pour cela.

Ce que j’ai essayé:
j’ai essayé de chercher des options pour mknod & mkfifo, mais je n’en ai pas trouvé.

REMARQUE: je ne discute pas du modèle serveur-client via Ethernet / réseau. Le fichier de socket nommé sera utilisé par 2 processus sur le même système.

anishsane
la source
2
Juste une remarque: j'ai 2 processus - qemu & virsh, qui peuvent se parler en utilisant un socket nommé (selon ma compréhension basée sur la documentation) mais je ne sais pas comment créer un socket nommé. Bien qu'il existe d'autres options pour utiliser virsh avec qemu, je recherchais une option dans laquelle je pouvais attacher virsh à un processus qemu existant et qui nécessite un socket nommé , tout en démarrant le processus qemu. Le fifo nommé ne fonctionne pas. De plus, je pense que ce sera intéressant de savoir comment créer un socket nommé, au cas où cela serait nécessaire ultérieurement.
Anishsane

Réponses:

24

Un fichier de socket Unix / Linux est fondamentalement une FIFO à deux voies. Les sockets ayant été créés à l'origine pour gérer les communications réseau, il est possible de les manipuler à l'aide des appels système send()et recv(). Cependant, dans l’esprit Unix de «tout est un fichier», vous pouvez également utiliser write()et read(). Vous devez utiliser socketpair()ou socket()créer des sockets nommés. Un tutoriel sur l’utilisation de sockets en C est disponible ici: Guide Beej d’Unix IPC: Unix Sockets .

L' socatutilitaire de ligne de commande est utile lorsque vous voulez jouer avec des sockets sans écrire un "vrai" programme. Il est similaire à netcatet agit comme un adaptateur entre différentes interfaces de réseau et de fichier.

Liens:

Joakim Nohlgård
la source
1
socketpair () ou socket () crée une socket non nommée, qui sera utile uniquement à partir du programme C.
Anishsane
Il serait intéressant de vérifier s’il est possible de créer un socket nommé en utilisant socat. Probablement, créez une socket non nommée, associez-la à localhost: some_port & utilisez ensuite socat avec ce port?
Anishsane
3
Il est possible de créer des sockets nommés en utilisant socatla commande UNIX-LISTEN, voir man socatou ce manuel HTML
Joakim Nohlgård
1
J'ai essayé cette commande rapide et sale et il a créé un fichier de socket f1: socat UNIX-LISTEN:f1 LISTEN:f2.
Totor
1
Cela se trouve dans les détails du site Web socat, mais au cas où cela serait utile, il existe une syntaxe permettant de traiter deux canaux nommés unidirectionnels (fifo) comme une seule unité bidirectionnelle pouvant être pontée vers d'autres entités bidirectionnelles telles que les sockets Unix ou TCP. Vous joignez les tuyaux nommés avec !!(socat 1.x) ou %(socat 2.x), avec l'écriture nommée tuyau à gauche et la lecture nommée tuyau à droite. par exemplesocat 'PIPE:/tmp/outstream!!PIPE:/tmp/instream' UNIX-CONNECT:/tmp/mysocket
Ivan X
17

Créez rapidement une socket en 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

Ou avec un petit programme C , par exemple, enregistrez ce qui suit dans 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;
}

Puis installez gcc, compilez-le, et 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
réduire
la source
1

Il n’existe aucun outil de ligne de commande permettant de créer des sockets puisqu’un socket est toujours connecté à un serveur qui gère les demandes envoyées à ce socket.

Vous devrez donc écrire un serveur et laisser cela créer le socket. Voici un tutoriel .

Aaron Digulla
la source
Ce serait toujours un socket non nommé. Je veux créer un socket, qui serait utilisé par 2 autres processus, en tant que fifo bidirectionnel.
Anishsane
Vérifiez le lien dans ma réponse. Il montre comment configurer bind()pour se connecter à"/home/beej/mysocket"
Aaron Digulla