05.11.2013 Aufrufe

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

4.3 <strong>Sockets</strong> 195<br />

Server<br />

Programm<br />

3<br />

aktiver Socket<br />

passiver Socket<br />

2 1<br />

4<br />

Listen Queue<br />

Abb. 4.11. Annahme neuer Netzwerkverbindungen<br />

#include<br />

<br />

int accept( int socket , struct sockaddr *address ,<br />

socklen_t *address_len );<br />

Die accept()-Funktion erwartet als ersten Parameter einen passiven Socket,<br />

aus dessen Warteschlange eine fertig aufgebaute Verbindung entnommen werden<br />

soll. Ist die Listen-Queue des übergebenen <strong>Sockets</strong> leer (<strong>und</strong> ist für den<br />

Socketdeskriptor das Flag O_NONBLOCK nicht gesetzt), blockiert der Aufruf von<br />

accept() so lange, bis eine neue Verbindung vorliegt.<br />

Der zweite Parameter ist ein Zeiger auf eine sockaddr-Struktur, in die die<br />

Socket-Adresse des neu angelegten <strong>Sockets</strong> kopiert wird. Ist die aufrufende<br />

Umgebung nicht an der Socket-Adresse interessiert, kann stattdessen ein Null-<br />

Zeiger übergeben werden.<br />

Das Argument address_len transportiert beim Aufruf von accept() Informationen<br />

in beide Richtungen, also von der Anwendung zum Systemkern <strong>und</strong><br />

umgekehrt: Beim Eintritt in die Funktion übergibt die Anwendung dem System<br />

in address_len die Größe des durch address referenzierten Speicherbereichs.<br />

Bei der Rückkehr aus der Funktion liefert das System der Anwendung<br />

Informationen über die Größe der tatsächlich kopierten Socket-Adresse. Ist die<br />

Länge der tatsächlich zu kopierenden Socket-Adresse größer als der bereitgestellte<br />

Speicherplatz, so wird die Socket-Adresse abgeschnitten. Dies wäre z. B.<br />

der Fall, wenn eine IPv6 Socket-Adresse zurückgeliefert werden soll, aber von<br />

der Anwendung in der durch sockaddr referenzierten Struktur nur Platz für<br />

eine IPv4 Socket-Adresse bereitgestellt wird.<br />

accept() liefert als Ergebnis den (nicht-negativen) Socketdeskriptor des neuen,<br />

aktiven <strong>Sockets</strong> zurück. Der neue Socket findet im weiteren Verlauf bei der<br />

Kommunikation <strong>mit</strong> dem Clientprogramm Verwendung <strong>und</strong> kann selbst keine

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!