Linux benannt Sockets Howto

38

Ich weiß, dass es unter Linux Sockets und Named Pipes (FIFO) gibt.

In ls -lwürden sie wie folgt aussehen: (Ich habe die Dateinamen zu Demonstrationszwecken geändert.)

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

Nun kann mit eine Named Pipe erzeugt werden mkfifo. Gibt es einen Befehl zum Erstellen eines benannten Sockets?

Die letzte Möglichkeit wäre, ein C-Programm zu schreiben, das die Funktion mknod aufruft, aber wissen möchte, ob es dafür bereits einen Befehl gibt.

Was ich versucht habe:
Ich habe versucht, nach Optionen für mknod & mkfifo zu suchen, konnte aber keine finden.

HINWEIS: Ich spreche nicht über das Server-Client-Modell über Ethernet / Netzwerk. Die angegebene Socket-Datei wird von 2 Prozessen auf demselben System verwendet.

anishsane
quelle
2
Nur eine Anmerkung: Ich habe 2 Prozesse - qemu & virsh, die unter Verwendung eines benannten Sockets miteinander kommunizieren können (nach meinem Verständnis basierend auf der Dokumentation). Aber ich weiß nicht, wie man einen benannten Socket erstellt. Während es andere Optionen gibt, um virsh mit qemu zu verwenden, habe ich nach einer Option gesucht, bei der ich virsh an einen vorhandenen qemu-Prozess anhängen kann und der beim Starten des qemu-Prozesses einen benannten Socket benötigt. Named Fifo funktionieren nicht. Außerdem ist es meiner Meinung nach interessant zu wissen, wie ein benannter Socket erstellt wird, falls er später benötigt wird.
Anishsane

Antworten:

24

Eine Unix / Linux-Socket-Datei ist im Grunde ein Zwei-Wege-FIFO. Da Sockets ursprünglich zur Verwaltung der Netzwerkkommunikation erstellt wurden, können sie mit den Systemaufrufen send()und recv()bearbeitet werden. Im Unix-Geist von „Alles ist eine Datei“ können Sie jedoch auch write()und verwenden read(). Sie müssen benannte Sockets verwenden socketpair()oder socket()erstellen. Ein Tutorial zur Verwendung von Sockets in C finden Sie hier: Beejs Handbuch zu Unix IPC: Unix-Sockets .

Das socatBefehlszeilenprogramm ist nützlich, wenn Sie mit Sockets herumspielen möchten, ohne ein "echtes" Programm zu schreiben. Es ähnelt netcatund fungiert als Adapter zwischen verschiedenen Netzwerk- und Dateischnittstellen.

Links:

Joakim Nohlgård
quelle
1
socketpair () oder socket () erzeugt einen unbenannten Socket, der nur innerhalb des C-Programms nützlich ist.
Anishsane
Es wäre interessant zu prüfen, ob es möglich ist, einen benannten Socket mit zu erstellen socat. Erstellen Sie wahrscheinlich einen Socket ohne Namen, binden Sie ihn an localhost: some_port und verwenden Sie dann socat für diesen Port.
Anishsane
3
Es ist möglich, benannte Sockets socatmit dem Befehl UNIX-LISTEN (siehe man socatoder dieses HTML-Handbuch
Joakim Nohlgård,
1
Ich habe versucht , diese quick & dirty Befehl und eine Socket - Datei erstellt f1: socat UNIX-LISTEN:f1 LISTEN:f2.
Totor
1
Es ist in den Details der socat-Website vergraben, aber falls es hilfreich ist, gibt es eine Syntax für die Behandlung von zwei unidirektionalen Named Pipes (FIFOs) als eine einzige bidirektionale Einheit, die mit anderen bidirektionalen Entitäten wie Unix- oder TCP-Sockets überbrückt werden kann. Sie verbinden die !!Named Pipes mit (socat 1.x) oder %(socat 2.x), wobei der Schriftzug Named Pipes links und der Schriftzug Named Pipes rechts steht. zBsocat 'PIPE:/tmp/outstream!!PIPE:/tmp/instream' UNIX-CONNECT:/tmp/mysocket
Ivan X
17

Erstellen Sie schnell einen 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

Oder speichern Sie mit einem winzigen C-Programm beispielsweise Folgendes 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;
}

Dann installiere gcc, kompiliere es und 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
rsaw
quelle
1

Es gibt kein Befehlszeilentool zum Erstellen von Sockets, da ein Socket immer mit einem Server verbunden ist, der die an diesen Socket gesendeten Anforderungen verarbeitet.

Sie müssen also einen Server schreiben und diesen den Socket erstellen lassen. Hier ist ein Tutorial .

Aaron Digulla
quelle
Das wäre doch ein unbenannter Socket. Ich möchte einen Socket erstellen, der von 2 anderen Prozessen als bidirektionales Fifo verwendet wird.
Anishsane
Überprüfen Sie den Link in meiner Antwort. Es zeigt, wie die bind()Verbindung zu"/home/beej/mysocket"
Aaron Digulla