Un fichier de socket Unix/Linux est essentiellement un FIFO bidirectionnel. Étant donné que les sockets ont été créés à l'origine pour gérer les communications réseau, il est possible de les manipuler en utilisant le send()
et recv()
appels système. Cependant, dans l'esprit Unix du "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 l'utilisation des sockets en C peut être trouvé ici :Beej's Guide to Unix IPC :Unix Sockets.
Le socat
L'utilitaire de ligne de commande est utile lorsque vous voulez 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 :
socat
accueil du projet- Une introduction à
socat
- Article intéressant sur les sockets Unix et
socat
Créez rapidement un 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;
}
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