web-dev-qa-db-fra.com

Linux nommé sockets howto

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éé en utilisant 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 existait déjà une commande pour cela.

Ce que j'ai essayé
J'ai essayé de rechercher 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.

36
anishsane

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(). Toutefois, dans l’esprit Unix de "tout est un fichier", vous pouvez également utiliser write() et read(). Vous devez utiliser socketpair() ou socket() pour créer des sockets nommés. Un tutoriel pour utiliser des sockets en C peut être trouvé ici: Guide de Beej sur Unix IPC: Unix Sockets .

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

Liens:

22
Joakim Nohlgård

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 les éléments suivants 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
17
rsaw

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 .

1
Aaron Digulla