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

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

4.3 <strong>Sockets</strong> 189<br />

kehrt umgehend <strong>mit</strong> dem Rückgabewert -1 zurück <strong>und</strong> die Fehlervariable<br />

errno ist auf ECONNREFUSED gesetzt, d. h. der Verbindungsaufbau wurde vom<br />

Zielsystem abgelehnt. Das Beispielprogramm beendet sich folgerichtig <strong>mit</strong> der<br />

Fehlermeldung Connection refused“.<br />

”<br />

Als zweites versuchen wir, <strong>mit</strong> dem Clientprogramm eine Verbindung zu einem<br />

momentan ausgeschalteten Rechnersystem, hier der Rechner <strong>mit</strong> der IPv4-<br />

Adresse 192.168.1.3, herzustellen:<br />

$ ./timeclient 192.168.1.3<br />

connect() failed: Connection timed out<br />

Beim Verbindungsversuch zur IP-Adresse 192.168.1.3 schlägt der oben beschriebene<br />

”<br />

Timeout“ zu. Die connect()-Funktion wartet ein system- bzw.<br />

implementierungsabhängiges Intervall auf das Zustandekommen einer Netzwerkverbindung.<br />

Sobald dieses Zeitintervall erfolglos verstrichen ist, meldet<br />

connect() über errno die entsprechende Fehlerursache – hier also ETIMEDOUT<br />

bzw. “Connection timed out“.<br />

4.3.4 Socket-Adressen zuweisen<br />

Mit der connect()-Funktion können wir eine Socketverbindung zu einem bestimmten<br />

Port auf einem entfernten Rechner aufbauen. Die zugehörige Socket-<br />

Adresse <strong>mit</strong> IP-Adresse <strong>und</strong> Portnummer wird beim connect()-Aufruf angegeben.<br />

Bei den bisherigen Betrachtungen blieb allerdings offen, welche Socket-<br />

Adresse dabei am lokalen Ende der Netzwerkverbindung verwendet wird.<br />

Ein neuer Socket wird, nachdem er <strong>mit</strong> der socket()-Funktion angelegt wurde,<br />

zunächst als unbenannter Socket bezeichnet. Da<strong>mit</strong> soll zum Ausdruck<br />

kommen, daß dieser Socket noch nicht <strong>mit</strong> einer Socket-Adresse verknüpft<br />

ist. Erst durch ein späteres explizites oder implizites Binden an eine Socket-<br />

Adresse wird der Socket vollständig gebrauchsfähig. Zur Netzwerkkommunikation<br />

wird dem Socket dabei eine IP-Adresse <strong>und</strong> eine Portnummer zugewiesen.<br />

Anschließend läßt sich die so<strong>mit</strong> festgelegte Verbindungscharakteristik<br />

des <strong>Sockets</strong>, nämlich seine IP-Adresse <strong>und</strong> seine Portnummer, benennen <strong>und</strong><br />

man spricht folglich von einem benannten Socket.<br />

Eine Form der impliziten Zuweisung haben wir bereits kennengelernt: Sofern<br />

der übergebene Socket noch nicht geb<strong>und</strong>en ist, bindet die connect()-<br />

Funktion eine lokale IP-Adresse <strong>und</strong> eine freie Portnummer an den Socket. 18<br />

18 Die von connect() durchgeführte implizite Verknüpfung einer lokalen Socket-<br />

Adresse <strong>mit</strong> dem Socket hat nichts <strong>mit</strong> der an connect() übergebenen Socket-<br />

Adreßstruktur zu tun, welche ja den entfernten (<strong>und</strong> nicht den lokalen) Endpunkt<br />

der Kommunikationsstrecke beschreibt.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!