Netzwerkprogrammierung mit Sockets

Funktion "socket"

Zu Beginn muss man das zu verwendende Protokoll spezifizieren. Dies erfolgt mit der Funktion

SOCKET socket( int family, int type, int protocol );

Das erste Argument spezifiziert die Protokollfamilie (Adressfamilie). Mögliche Werte sind unter anderem:

  • AF_UNIX Unix-internes Protokoll

  • AF_INET Internet-Protokoll IPv4

  • AF_INET6 Internet-Protokoll IPv6

  • AF_APPLETALK AppleTalk

Diese Werte sind als Konstanten in entsprechenden Header-Dateien definiert. Das Präfix AF_ steht für Adressfamilie. Gleichwertig dazu existieren die Konstanten mit den gleichen Endungen und dem Präfix PF_ für Protokollfamilie. Das zweite Argument type gibt die Art der Verbindung an. Die wichtigsten Möglichkeiten sind:

  • SOCK_STREAM Stromorientierte Verbindung

  • SOCK_DGRAM Datagrammverbindung

Eine weitere Option ist SOCK_RAW. Damit werden beispielsweise im Programm Ping ICMP-Pakete über einen Socket versandt. Das Argument protocol wird in den meisten Fällen auf 0 (NULL) gesetzt. Dann wird automatisch aus den beiden anderen Argumenten das passende Protokoll ausgewählt. So resultiert aus der Kombination AF_INET mit SOCK_STREAM eine TCP-Verbindung. AF_INET mit SOCK_DGRAM definiert eine UDP-Verbindung. Ansonsten kann man auch explizit ein Protokoll auswählen (z.B. IPPROTO_TCP).

Bei Erfolg liefert die Funktion einen Bezeichner für einen Socket zurück. Eigentlich handelt es sich lediglich um einen Integer-Wert - sozusagen um den Index des Sockets. Zur besseren Lesbarkeit des Programms kann man den Datentyp SOCKET verwenden. Das folgende Codefragment zeigt beispielhaft einen Aufruf, um einen Socket für TCP zu erzeugen:

SOCKET sockListen;
sockListen=socket(AF_INET,SOCK_STREAM,NULL);
if (sockListen == INVALID_SOCKET) {
printf("Error: Cannot create Socket\\n");
}