it-swarm.com.de

Linux namens Sockets Howto

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

In ls -l sehen sie wie folgt aus: (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 Named Pipe mit mkfifo erstellt werden. 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 ausprobiert 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.

36
anishsane

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 read() verwenden. Sie müssen socketpair() oder socket() verwenden, um benannte Sockets zu erstellen. Ein Tutorial zur Verwendung von Sockets in C finden Sie hier: Beejs Leitfaden zu Unix IPC: Unix-Sockets .

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

Links:

22

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 mit einem winzigen C-Programm , z. B. Folgendes in create-a-socket.c speichern:

#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
17
rsaw

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 .

1
Aaron Digulla