Wie sieht's aus?
#include <sys/types.h>
#include <sys/socket.h>
int bind(int s, const struct sockaddr *addr, socklen_t addrlen);
Was tut's?
Mit bind() kann man einen Socket an eine lokale Adresse binden. Das tut man zum Beispiel, wenn man einen Server starten möchte. Allerdings hat bind() auch eine Bedeutung für sendende Sockets: wird das vor einem connect() gemacht, so kann man damit einen Quellport festlegen. Es gilt hier im Allgemeinen, daß Ports unterhalb von 1024 (die sog. well-known ports) nur für den Superuser zulässig sind.
Was machen die Parameter?
Der erste Parameter ist wieder der Socket, auf den operiert wird.
Der zweite Parameter ist analog zu connect() eine Struktur, die eine Zieladresse enthält. In diesem Zusammenhang gilt es die Konstante INADDR_ANY zu erwähnen: sie steht für 0.0.0.0 und bezeichnet damit - wie der Name sagt - eine beliebige Adresse. Bei bind() bedeutet dies, daß sich Clients von überall aus verbinden können. Wenn man hier eine (einem lokalen Interface zugewiesene!) Adresse einsetzt, so werden nur Verbindungen akzeptiert, die diese Adresse als Ziel tragen. Wenn der Port auf 0 gesetzt wird, wählt das Betriebssystem automatisch einen freien Port aus.
Der dritte Parameter bezeichnet hier wieder die Länge der Struktur.
Wie verwende ich es?
int s;
struct sockaddr_in addr;
... /* s = socket (...); */
addr.sin_addr.s_addr = ... /* z.B. inet_addr("127.0.0.1"); */
addr.sin_port = ... /* z.B. htons(80); */
addr.sin_family = AF_INET;
if (bind(s, (struct sockaddr*) &addr, sizeof(addr)) == -1)
{
perror("bind() failed");
return 2;
}