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

connect() erwartet als erstes Argument einen Socketdeskriptor, den wir<br />

durch einen vorausgehenden Aufruf der socket()-Funktion erhalten. Der Parameter<br />

address ist ein Zeiger auf eine sockaddr-Struktur. Je nachdem,<br />

ob wir über IPv4 oder IPv6 kommunizieren wollen, übergeben wir hier<br />

tatsächlich einen Zeiger auf entweder (IPv4) eine sockaddr_in- oder (IPv6)<br />

eine sockaddr_in6-Struktur. Der dritte Parameter spezifiziert die Größe der<br />

von address referenzierten Socket-Adreßstruktur. Im Erfolgsfall liefert die<br />

Funktion den Wert 0 zurück <strong>und</strong> die Netzwerkverbindung zur Gegenseite ist<br />

erfolgreich hergestellt.<br />

Kann connect() eine TCP-Verbindung nicht sofort herstellen (<strong>und</strong> ist für den<br />

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

bis entweder die Verbindung zustande kommt oder ein Timeout eintritt.<br />

Wie lange auf das Zustandekommen einer TCP-Verbindung gewartet wird, ist<br />

in IEEE Std 1003.1-2001 nicht festgelegt, typische Werte liegen aber, je nach<br />

Betriebssystem, zwischen 60 <strong>und</strong> 90 Sek<strong>und</strong>en. Kann keine Verbindung zur<br />

Gegenseite hergestellt werden, kehrt connect() <strong>mit</strong> dem Rückgabewert -1<br />

<strong>und</strong> entsprechend gesetzter errno-Variable zurück.<br />

Die von address referenzierte Socket-Adreßstruktur muß vor dem Aufruf von<br />

connect() anhand der Anforderungen an die neue Verbindung initialisiert<br />

werden. Beispiel 4.5 illustriert den Einsatz der connect()-Funktion <strong>und</strong> zeigt<br />

gleichzeitig die Initialisierung der Socket-Adreßstruktur. Das Programm baut<br />

eine Client-Verbindung zu einem Timeserver auf. Die IP-Adresse des Rechners,<br />

zu dem sich das Beispielprogramm verbinden soll, wird dabei über die<br />

Kommandozeile angegeben.<br />

Clientprogramm für das Time-Protokoll<br />

1–13<br />

15–19<br />

21–26<br />

Das Time-Protokoll ist in RFC 868 festgelegt <strong>und</strong> ähnelt sehr stark dem zuvor<br />

beschriebenen Daytime-Protokoll. Der Timeserver wartet an Port 37 auf<br />

Client-Anfragen <strong>und</strong> gibt die Zeit in binärem Format als 32 Bit lange Ganzzahl<br />

zurück. Die über<strong>mit</strong>telte Zahl gibt die seit dem 1. 1. 1900 um 0.00 Uhr<br />

verstrichenen Sek<strong>und</strong>en an. Nach der Übertragung des Zeitstempels beenden<br />

Client <strong>und</strong> Server umgehend die Netzwerkverbindung.<br />

Zunächst werden die für das Programm benötigten Header-Dateien eingeb<strong>und</strong>en<br />

<strong>und</strong> die eingesetzten Variablen definiert. Die Variable sd verwenden wir<br />

als Socketdeskriptor <strong>und</strong> die IPv4 Socket-Adreßstruktur sa füllen wir später<br />

<strong>mit</strong> unseren Verbindungsdaten.<br />

Danach prüfen wir als erstes, ob das Programm <strong>mit</strong> der richtigen Anzahl von<br />

Parametern aufgerufen wurde. Wir erzwingen, daß genau ein Kommandozeilenargument,<br />

die IP-Adresse des Timeservers, angegeben werden muß.<br />

Der erste Schritt zum Verbindungsaufbau ist das Anlegen eines neuen <strong>Sockets</strong>.<br />

Mit den beiden Parametern AF_INET <strong>und</strong> SOCK_STREAM erzwingen wir, daß

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!