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> 213<br />

Ein- <strong>und</strong> Ausgabefunktionen der C-Standardbibliothek kann auf eine Ausgabefunktion<br />

nicht direkt eine Eingabefunktion folgen, ohne zuvor fflush(),<br />

fseek(), fsetpos() oder rewind() aufgreufen zu haben. Ähnliches gilt,<br />

falls von einer Eingabefunktion auf eine Ausgabefunktion gewechselt werden<br />

soll. fseek(), fsetpos() <strong>und</strong> rewind() basieren allerdings auf der lseek()-<br />

Funktion, welche für <strong>Sockets</strong> fehlschlägt. Diese Probleme vermeidet man am<br />

besten, indem man für einen Socket <strong>mit</strong>tels fdopen() zwei verschiedene FILE-<br />

Strukturen ableitet: Ein Datenstrom dient dann exklusiv der Eingabe <strong>und</strong> der<br />

andere Datenstrom ausschließlich der Ausgabe über den selben Socket.<br />

Zusammenfassend läßt sich allerdings festhalten, daß für die Programmierung<br />

<strong>mit</strong> <strong>Sockets</strong> anstatt der Funktionen der C-Standardbibliothek besser auf die<br />

elementaren Ein- <strong>und</strong> Ausgabefunktionen des POSIX-Standards zurückgegriffen<br />

werden sollte.<br />

4.3.10 Socket-Adressen er<strong>mit</strong>teln<br />

In etlichen Situationen kann es notwendig sein, zu einem vorhandenen Socket<br />

die Socket-Adresse zu bestimmen. Beispielsweise binden die Socket-Funktionen<br />

connect() <strong>und</strong> listen() im Bedarfsfall implizit eine Socket-Adresse an den<br />

übergebenen Socket. Hier stellt sich unter Umständen die Frage, <strong>mit</strong> welcher<br />

lokalen IP-Adresse oder <strong>mit</strong> welchem lokalen Port der betreffende Socket von<br />

diesen Funktionen assoziiert worden ist. Ein weiteres Beispiel: Bei Servern, die<br />

über den inetd gestartet wurden, sind die Standard Ein- <strong>und</strong> Ausgabe sowie<br />

die Fehlerausgabe <strong>mit</strong> einem Socket verknüpft. Diese Verknüpfung wurde<br />

noch vom Internet Dæmon hergestellt, bevor dieser das eigentliche Serverprogramm<br />

gestartet hat. Demzufolge sind dem Server die Socket-Adressen der<br />

bestehenden Verbindung zunächst nicht bekannt. Auch hier stellt sich für den<br />

Server also in aller Regel die Frage, von welcher IP-Adresse aus die Anfrage<br />

gestellt wurde <strong>und</strong> dazu muß er die Socket-Adresse bestimmen.<br />

Mit den beiden Funktionen getpeername() <strong>und</strong> getsockname() stellt der<br />

POSIX-Standard die passenden Werkzeuge zur Verfügung, um diese Fragen<br />

zu beantworten. getsockname() analysiert dabei den lokalen Endpunkt des<br />

übergebenen <strong>Sockets</strong>, während getpeername() Informationen über den entfernten<br />

Endpunkt liefert.<br />

#include<br />

<br />

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

socklen_t *address_len );<br />

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

socklen_t *address_len );

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!