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.

206 4 Gr<strong>und</strong>lagen der Socket-Programmierung<br />

Aus den unterschiedlichen Protokolleigenschaften von TCP <strong>und</strong> UDP leiten<br />

sich also für die Programmierung von Anwendungen, die anstelle von TCP<br />

auf das User Datagram Protocol setzen, einige prinzipielle Unterschiede ab.<br />

Ein UDP-Server legt zunächst <strong>mit</strong>tels socket() einen neuen Socket an,<br />

als Sockettyp (vgl. Abschnitt 4.3.1) gibt er dabei SOCK_DGRAM für einen<br />

Datagramm- bzw. UDP-Socket an. Als Standardprotokoll für den neuen<br />

Socket wird dadurch automatisch SOCK_DGRAM ausgewählt. Danach bindet<br />

sich der Server wie gewohnt über bind() an einen festen, den Clients bekannten<br />

Port. Anstatt nun, wie bei TCP üblich, den Socket <strong>mit</strong> listen() in<br />

einen horchenden Socket umzuwandeln <strong>und</strong> danach <strong>mit</strong> accept() auf neue<br />

Verbindungen zu warten, ruft der Server nun direkt die recvfrom()-Funktion<br />

auf. Der Aufruf von recvfrom() blockiert nun solange, bis Daten am Socket<br />

bereitstehen. Seine Antwort schickt der UDP-Server schließlich <strong>mit</strong> sendto()<br />

an den Client zurück.<br />

Für einen UDP-Client sieht der Fall bis auf den fehlenden bind()-Aufruf ähnlich<br />

aus: Auch der Client legt zunächst <strong>mit</strong>tels socket() einen neuen UDP-<br />

Socket an. Gleich anschließend kann er dann <strong>mit</strong>tels sendto() eine Anfrage<br />

an einen UDP-Server schicken <strong>und</strong> danach <strong>mit</strong> recvfrom() auf die Antwort<br />

der Gegenseite warten.<br />

Datenübertragung <strong>mit</strong> UDP<br />

Anstatt der Funktionen read() <strong>und</strong> write() verwendet man <strong>mit</strong> UDP-<br />

<strong>Sockets</strong> das Funktionenpaar recvfrom() <strong>und</strong> sendto() zum Nachrichtenaustausch.<br />

Analog zu read() <strong>und</strong> write() erwarten auch diese beiden Funktionen<br />

in ihren ersten drei Argumenten einen Socket-Fildeskriptor socket, die<br />

Adresse buffer eines Speicherbereichs, in dem die empfangenen Daten abgelegt<br />

werden sollen bzw. in dem die zu verschickenden Daten liegen, sowie die<br />

Anzahl length der zu empfangenden oder zu verschickenden Bytes.<br />

#include<br />

<br />

ssize_t recvfrom(int socket , void *buffer , size_t length ,<br />

int flags, struct sockaddr *address ,<br />

socklen_t *address_len);<br />

ssize_t sendto( int socket , const void *message ,<br />

size_t length , int flags,<br />

const struct sockaddr *dest_addr , socklen_t dest_len );<br />

Darüber hinaus erwartet das Funktionenpaar noch drei weitere Argumente:<br />

Der Parameter flags spezifiziert die Art der Datenübertragung <strong>und</strong> wird in<br />

den vorliegenden Beispielen immer <strong>mit</strong> dem Wert 0 (Standardeinstellung) initialisiert.<br />

Die recvfrom()-Funktion erwartet in address einen Zeiger auf

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!