Linux: Was ist der Unterschied zwischen socketpair () und socket ()?


Antwort 1:

Unix-Sockets sind wie Zwei-Wege-FIFOs. Die gesamte Datenkommunikation erfolgt jedoch über die Sockets-Schnittstelle und nicht über die Dateischnittstelle. Obwohl Unix-Sockets eine spezielle Datei im Dateisystem sind (genau wie FIFOs), verwenden Sie nicht open () und read () - Sie verwenden socket (), bind (), recv () usw.

Wenn Sie beispielsweise beschreiben, welchen Unix-Socket Sie verwenden möchten (dh den Pfad zu der speziellen Datei, die der Socket ist), verwenden Sie eine Struktur sockaddr_un

struct sockaddr_un {unsigned short sun_family; / * AF_UNIX * / char sun_path [108];}

Dies ist die Struktur, die Sie an die Funktion bind () übergeben, die einen Socket-Deskriptor (einen Dateideskriptor) mit einer bestimmten Datei verknüpft (deren Name sich im Feld sun_path befindet).

Socketpairs sind normale AF_UNIX-Sockets. Dies bedeutet, dass Zusatznachrichten wie SCM_RIGHTS und SCM_CREDENTIALS über sie übertragen werden können.

Wenn Sie eine Pipe () wollten, aber eine einzige Pipe verwenden möchten, um Daten von beiden Seiten zu senden und zu empfangen? Da Pipes unidirektional sind (mit Ausnahmen in SYSV), können Sie dies nicht tun! Es gibt jedoch eine Lösung: Verwenden Sie einen Unix-Domain-Socket, da dieser bidirektionale Daten verarbeiten kann.

Es gibt die Schönheit eines Systemaufrufs, der als socketpair () bekannt ist. Dies ist nett genug, um Ihnen ein Paar bereits verbundener Sockets zurückzugeben

if (Socketpair (AF_UNIX, SOCK_STREAM, 0, sv) == -1) {perror ("Socketpair"); Ausfahrt (1); }}