Netzwerkprogrammierung mit Sockets

Funktion "bind"

Im nächsten Schritt muss der Server dem Socket einen Namen geben, unter dem er später erreichbar sein wird. Dazu dient die Funktion bind in der Form

int bind( SOCKET s, sockaddr *p_addr, int addrlen );

Das erste Argument ist der soeben angelegte Socket. Zur Übergabe der spezifischen Details wird eine Struktur SOCKADDR verwendet. Das zweite Argument besteht in einem Zeiger auf eine solche Struktur. Die Größe der Struktur gibt das dritte Argument an. Für TCP verwendet man die Struktur SOCKADDR_IN mit folgenden Elementen:

struct sockaddr_in{
short sin_family;
unsigned short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};

Das erste Element bestimmt die Adressfamilie. Das dritte Element ist wiederum eine Struktur, die die IP-Adresse enthält. Für unsere Zwecke reicht es aus, in dieser Unterstruktur ein Element auf INADDR_ANY zu setzen, um ein beliebiges Netzwerk-Interface an dem eigenen Rechner zu erlauben. Entscheidend ist das zweite Element sin_port. Hier wird die so genannte Portnummer eingetragen - der Name oder die Adresse für den Socket. Damit wird das System informiert, dass alle an diesem Port eingehenden Nachrichten an das Programm weitergereicht werden sollen. Bestimmte Dienste sind mit festen Portnummern verknüpft (zum Beispiel Webserver Port 80). Unter UNIX können normale Benutzer nur Portnummern oberhalb von 1024 verwenden.

Bei der Angabe der Portnummer gilt es, die für das TCP-Protokoll passende Darstellung einer Integer-Zahl zu beachten. Verschiedene Systeme unterscheiden sich in der Reihenfolge von Low-Byte und High-Byte. Das Makro htons (Host to network, short) wandelt Integer-Werte vom Typ short entsprechend um. Genauer gesagt tauscht es, falls erforderlich, Low-Byte mit High-Byte. Mit diesen Bestandteilen kann man in folgender Weise die Portnummer 5432 an den Socket binden:

#define SERVER_PORT 5432

long rc;
SOCKADDR_IN addr;
int addrlen = sizeof(addr);

addr.sin_family = AF_INET;
addr.sin_port = htons(SERVER_PORT);
addr.sin_addr.s_addr = INADDR_ANY;

rc = bind(sockListen, (SOCKADDR*)&addr, sizeof(addr));
if (rc == SOCKET_ERROR) {
printf("Error: Cannot bind Socket\\n");
}