accept() - Signatur

#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.

Hilfe unter Linux

$ man accept

Beispiele

Einen Port 'abhorchen'

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);
}