Linux-Anleitung für benannte Sockets

Linux-Anleitung für benannte Sockets

Ich weiß, dass es in Linux benannte Sockets und benannte Pipes (FIFO) gibt.

In ls -lwürden sie wie folgt aussehen: (Ich habe die Dateinamen zur Demonstration 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

Jetzt kann eine benannte Pipe mit erstellt werden mkfifo. Gibt es einen Befehl zum Erstellen eines benannten Sockets?

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

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

HINWEIS: Ich bespreche hier nicht das Server-Client-Modell über Ethernet/Netzwerk. Die benannte Socket-Datei wird von zwei Prozessen auf demselben System verwendet.

Antwort1

Eine Unix/Linux-Socket-Datei ist im Grunde ein bidirektionales FIFO. Da Sockets ursprünglich als Methode zur Verwaltung der Netzwerkkommunikation entwickelt wurden, können sie mithilfe der Systemaufrufe und manipuliert werden. Im Sinne des Unix-Gedankens „alles ist eine Datei“ können Sie jedoch auch und verwenden send(). Sie müssen oder verwenden , um benannte Sockets zu erstellen. Ein Tutorial zur Verwendung von Sockets in C finden Sie hier: recv()write()read()socketpair()socket()Beejs Leitfaden 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 netcateinem Adapter zwischen verschiedenen Netzwerk- und Dateischnittstellen und fungiert als solcher.

Links:

Antwort2

So 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

Odermit einem winzigen C-Programm, speichern Sie beispielsweise Folgendes unter 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;
}

Installieren Sie dann gcc, kompilieren Sie 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

Antwort3

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.

verwandte Informationen