
Ich weiß, dass es in Linux benannte Sockets und benannte Pipes (FIFO) gibt.
In ls -l
wü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 socat
Befehlszeilenprogramm ist nützlich, wenn Sie mit Sockets herumspielen möchten, ohne ein „echtes“ Programm zu schreiben. Es ähnelt netcat
einem 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.