43 votes

Linux named sockets howto

Je sais qu'il existe des sockets et des pipes (fifo) sous Linux.

En ls -l ils se présenteraient comme suit : (J'ai changé les noms de fichiers pour la 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

Il est maintenant possible de créer un tuyau nommé à l'aide de mkfifo . Existe-t-il une commande permettant de créer une socket nommée ?

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

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

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

28voto

christian Points 1

Un fichier socket Unix/Linux est essentiellement une FIFO à double sens. Comme les sockets ont été créés à l'origine pour gérer les communications réseau, il est possible de les manipuler à l'aide de la fonction send() y recv() les appels au système. Cependant, dans l'esprit Unix de "tout est un fichier", vous pouvez également utiliser write() y read() . Vous devez utiliser socketpair() o socket() pour créer des sockets nommés. Un tutoriel sur l'utilisation des sockets en C est disponible ici : Beej's Guide to Unix IPC : Unix Sockets (en anglais) .

En socat est un utilitaire en ligne de commande utile pour jouer avec les sockets sans écrire un "vrai" programme. Il est similaire à netcat et agit comme un adaptateur entre différentes interfaces de réseau et de fichiers.

Liens :

19voto

Olaf Points 11

Créer 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 en C par exemple, enregistrer 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;
}

Ensuite, 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

1voto

Aaron Digulla Points 6565

Il n'existe pas d'outil de ligne de commande pour créer des sockets, car une socket est toujours connectée à un serveur qui traite les demandes envoyées à cette socket.

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X