FACHHOCHSCHULE MUENCHEN FACHBEREICH ELEKTROTECHNIK UND INFORMATIONSTECHNIK
BEREICH DATENTECHNIK V – BS – B21 – 00 – TH – 01
-----------------------------------------------------------------------------------
UNIX-Domain-Sockets in LINUX
•• Allgemeines
Die Protokollfamilie PF_UNIX (==PF_LOCAL) ist die einfachste Protokollfamilie innerhalb des Socket-APIs.
Sie stellt die UNIX-Domain-Sockets zur Verfügung.
Diese Sockets ermöglichen keine echte Netzwerkkommunikation sondern eine Kommunikation zwischen beliebigen
Prozessen des gleichen Rechners (lokale Interprozeß-Kommunikation).
Die miteinander kommunizierenden Prozesse müssen weder miteinander verwandt sein noch die gleiche EUID besitzen.
UNIX-Domain-Sockets sind – im Unterschied zu Named Pipes - immer verbindungsorientiert.
Zwischen zwei Prozessen wird ein privater Kommunikationskanal eingerichtet, in den kein dritter Prozeß eindringen kann.
Ein Server-Prozeß, der gleichzeitig Verbindungen zu mehreren Clients unterhält, verwendet für jede Verbindung einen
eigenen File-Deskriptor.
Gültige Protokoll-Typen sind : SOCK_STREAM und SOCK_DGRAM.
Dabei arbeitet SOCK_DGRAM ebenfalls verbindungsorientiert und gewährleistet Sequencing und eine Fehlerkontrolle
(zuverlässige Verbindung).
•• UNIX-Domain-Adressen
Die Adressen von UNIX-Domain-Sockets sind Dateipfade im Dateisystem (Adreß-Familie AF_UNIX bzw AF_LOCAL)
Hierfür existiert ein eigener Dateityp "Socket".
Durch das Binden einer Adresse an einen Socket (mittels bind()) wird ein neuer Eintrag im Dateisystem vom Typ
"Socket" erzeugt.
Falls bereits ein Eintrag des angegebenen Pfadnamens existiert (egal welchen Dateityps), endet bind() mit dem Fehler
EADDRINUSE.
Damit ein (Client-)Prozeß eine Verbindung zu einem existierenden (Server-)Socket aufnehmen kann ( mittels System Call
connect() muß er Lese- und Schreibrechte zu der entsprechenden "Socket-Datei" besitzen.
Nach Beendigung der Verwendung eines Sockets muß dieser wieder aus dem Dateisystem entfernt werden
(à System Call unlink()).
•• Structure-Datentyp struct sockaddr_un
Dieser in <sys/un.h> definierte Datentyp dient zur Darstellung von UNIX-Domain-Adressen.
Die für diesen Adreßtyp anzugebende Länge (als Parameter in System Calls) ergibt sich als Summe der Länge der Adreß-
Familien-Komponente (sun_family) und der tasächlichen Länge des Dateipfades.
Beispiel : struct sockaddr_sun my_addr;
socklen_t addrlen;
...
addrlen = sizeof(my_addr->sun_family) + strlen(my_addr->sun_path);
Achtung : Bei der Übergabe eines Pointers auf diese Adreß-Struktur in den System Calls ist ein Cast in einen Pointer auf
den generischen Socket-Adreßtyp struct sockaddr* notwendig.
struct sockaddr_un {
unsigned short sun_family; /* Address family, hier AF_UNIX */
char sun_data[108]; /* Address Data : Dateipfad */
};