#include<sys/types.h>
#include<sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, int *addrlen);
Diese Funktion wird erst nach bind() und
listen() aufgerufen.
Bei jedem Aufruf blockiert sie so lange, bis eine Anfrage den 'horchenden' Socket
erreicht und gibt dann einen Socket zurück der die Verbindung zum Client
repräsentiert. Mit Hilfe dieses Sockets können dem anfragenden Client
dann Daten gesendet werden (oder Daten von ihm gelesen werden). Sobald man einen Socket
von accept erhalten hat, sollte man diesen in einem eigenen Prozess (mit fork())
bearbeiten, damit der Serverprozess (der indem accept() aufgerufen wurde) sofort auf
evtl. weitere Anfragen reagieren kann. Zu beachten ist, dass es sich bei dem dritten
Parameter um einen Zeiger auf einen int handelt und nicht um einen int; es wäre
also nicht zulässig hier sizeof(addr)
zu übergeben. Vor dem
Funktionsaufruf sollte addrlen
die Größe (in Bytes) der
Struktur, auf die addr
zeigt enthalten. Danach enthält
addrlen
die Größe der zurückgegebenen Adresse (die sich
nun in addr
) befindet. Falls man sich nicht für die Adresse
eines Client interessiert kann auch NULL
für addr
übergeben werden. addrlen
kann in diesem Fall ebenfalls einen
Nullpointer erhalten, da der Wert nicht verändert wird.
$ man accept
int clientsocket;
int clientsize;
struct sockaddr_in addr;
clientsize = sizeof(addr);
for(;;){ /* Endlosschleife; meist bei Servern verwendet */
if((clientsocket = accept(socketfd, (struct sockaddr *)&addr, &clientsize)) == -1){
/* Fehler */
}
/* Alles hat geklappt; der Client-Socket kann nun bearbeitet werden */
handle(clientsocket);
}