Linux chiamato socket howto


38

So che ci sono nomi socket e named pipe (fifo) in Linux.

In ls -l, apparirebbero come di seguito: (Ho cambiato i nomi dei file, per dimostrazione.)

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

Ora, è possibile creare una pipe denominata utilizzando mkfifo. Esiste un comando per creare un socket denominato?

L'ultima opzione sarebbe quella di scrivere un programma C, che chiamerebbe la funzione mknod, ma che voleva sapere se esiste già un comando per quello.

Cosa ho provato:
ho provato a cercare qualsiasi opzione per mknod e mkfifo, ma non sono riuscito a trovarne uno.

NOTA: non sto discutendo del modello server-client su Ethernet / rete. Il file socket denominato verrà utilizzato da 2 processi sullo stesso sistema.


2
Solo una nota: ho 2 processi: qemu e virsh, che possono parlare tra loro usando socket chiamato (secondo la mia comprensione basata sulla documentazione) Ma non so come creare un socket denominato. Mentre ci sono altre opzioni per usare virsh con qemu, stavo cercando un'opzione, in cui posso collegare virsh a un processo qemu esistente e ha bisogno di un socket denominato , mentre avvia il processo qemu. Il quindicesimo nome non funziona. Inoltre, penso che sarà interessante sapere come creare un socket chiamato, nel caso sia richiesto in seguito.
anishsane,

Risposte:


24

Un file socket Unix / Linux è fondamentalmente un FIFO a due vie. Poiché i socket sono stati originariamente creati come un modo per gestire le comunicazioni di rete, è possibile manipolarli utilizzando le chiamate di sistema send()e recv(). Tuttavia, nello spirito Unix di "tutto è un file", puoi anche usare write()e read(). È necessario utilizzare socketpair()o socket()creare socket con nome. Un tutorial per l'utilizzo dei socket in C è disponibile qui: Beej's Guide to Unix IPC: Unix Sockets .

L' socatutilità della riga di comando è utile quando vuoi giocare con i socket senza scrivere un programma "reale". È simile netcate funge da adattatore tra diverse interfacce di rete e file.

link:


1
socketpair () o socket () crea un socket senza nome, che sarà utile solo all'interno del programma C.
anishsane,

Sarebbe interessante verificare se è possibile creare un socket denominato usando socat. Probabilmente, creare un socket senza nome, associarlo a localhost: some_port e quindi utilizzare socat con quella porta?
anishsane,

3
È possibile creare socket socatcon nome utilizzando il comando UNIX-LISTEN, vedere man socato questo manuale HTML
Joakim Nohlgård

1
Ho provato questo comando rapido e sporco ed è creato un file di socket f1: socat UNIX-LISTEN:f1 LISTEN:f2.
Totor

1
È sepolto nei dettagli del sito Web socat, ma nel caso sia utile, esiste una sintassi per trattare due pipe unidirezionali denominate (fifo) come una singola unità bidirezionale che può essere collegata ad altre entità bidirezionali come Unix o socket TCP. !!Unisci le named pipe con (socat 1.x) o %(socat 2.x), con la scritta named pipe a sinistra e la lettura denominata pipe a destra. ad es.socat 'PIPE:/tmp/outstream!!PIPE:/tmp/instream' UNIX-CONNECT:/tmp/mysocket
Ivan X

17

Crea rapidamente un socket in 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

O con un piccolo programma C , ad esempio, salvare quanto segue in 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;
}

Quindi installare gcc, compilarlo e 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

Non esiste uno strumento di linea commmand per creare socket poiché un socket è sempre connesso a un server che gestisce le richieste inviate a quel socket.

Quindi dovrai scrivere un server e lasciare che crei il socket. Ecco un tutorial .


Sarebbe comunque un socket senza nome. Voglio creare un socket, che verrebbe utilizzato da altri 2 processi, come un bidirezionale bidirezionale.
anishsane,

Controlla il link nella mia risposta. Mostra come configurare la bind()connessione a"/home/beej/mysocket"
Aaron Digulla
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.