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.

6.3 Open<strong>SSL</strong>-Basisfunktionalität 335<br />

36–41<br />

43–49<br />

51–53<br />

55–59<br />

Anschließend wird über BIO_do_connect() eine Netzwerkverbindung zum<br />

Server initiiert. Sollte die Verbindung nicht zustande kommen, so beendet<br />

sich das Clientprogramm <strong>mit</strong> einer Fehlermeldung.<br />

Sobald die Netzwerkverbindung zum Server hergestellt ist, kann der Client<br />

<strong>mit</strong>tels BIO_read() Daten vom Server empfangen. Da die zugr<strong>und</strong>eliegenden<br />

Ein-/Ausgabeoperationen standardmäßig blockierend arbeiten, bedeutet ein<br />

Rückgabewert ≤ 0 auf jeden Fall einen Fehler in der Kommunikation <strong>mit</strong> dem<br />

Timeserver, woraufhin das Programm die Verbindung beendet, eine Fehlermeldung<br />

ausgibt <strong>und</strong> sich <strong>mit</strong> exit() beendet.<br />

Andernfalls hat der Client über BIO_read() die aktuelle Uhrzeit vom Server<br />

empfangen. Er wandelt danach die Uhrzeit in ein lesbares Format um <strong>und</strong><br />

gibt sie <strong>mit</strong>tels BIO_puts() auf der Standardausgabe aus.<br />

Abschließend können die beiden BIO-Objekte wieder freigegeben werden,<br />

bevor sich das Programm beendet. Der Aufruf von BIO_free() sorgt bei<br />

bio_srv dafür, daß der zugehörige Clientsocket automatisch geschlossen wird,<br />

da für das BIO implizit BIO_CLOSE gesetzt ist. Für bio_stdout bleibt der da<strong>mit</strong><br />

verknüpfte Ausgabekanal stdout weiterhin geöffnet, da beim Setzen des<br />

FILE-Handles die Option BIO_NOCLOSE angegeben wurde.<br />

Ein BIO für passive Serversockets: BIO_s_accept()<br />

Um ein BIO-Objekt für einen passiven Socket zu erzeugen, bedient man<br />

sich der Hilfsfunktion BIO_s_accept(), die der BIO_new()-Funktion einen<br />

Bauplan für ein neues Accept-BIO liefert. Die anschließende Initialisierung<br />

des neuen BIO-Objekts kann, wie oben für Clientsockets beschrieben, via<br />

BIO_set_fd() <strong>und</strong> einen existierenden passiven Socket erfolgen. Alternativ<br />

läßt sich <strong>mit</strong>tels BIO_set_accept_port() eine Kombination aus Hostname<br />

(bzw. IP-Adresse) <strong>und</strong> Port für den neuen Serversocket festlegen. Das<br />

Argument host_port hat dabei wie bei BIO_set_conn_hostname() die Form<br />

"hostname:port", wobei allerdings bei passiven <strong>Sockets</strong> sowohl für den Hostnamen<br />

(bzw. die IP-Adresse) als auch für den Port <strong>mit</strong> * eine Wildcard angegeben<br />

werden darf (vgl. dazu Abschnitt 4.3.4). Darüber hinaus kann die<br />

Angabe des Hostnamens auch komplett entfallen, was ebenfalls einer Wildcard<br />

für die lokale IP-Adresse entspricht.<br />

Bevor der Socket nun geb<strong>und</strong>en wird, kann über BIO_set_bind_mode() noch<br />

festgelegt werden, ob die Socketoption SO_REUSEADDR für den Socket gesetzt<br />

sein soll. Ist SO_REUSEADDR gesetzt, so kann der Socket auch dann geb<strong>und</strong>en<br />

werden, wenn z. B. noch Kindprozesse der alten Serverinstanz aktiv sind oder<br />

sich noch Netzwerkverbindungen einer alten Instanz im Verbindungsabbau<br />

befinden (etwa im TCP-Zustand TIME_WAIT). Um dies zu erreichen, wird an<br />

BIO_set_bind_mode() im Parameter mode der Wert BIO_BIND_REUSEADDR<br />

übergeben. Die Standardeinstellung für einen neuen passiven Socket ist dagegen<br />

BIO_BIND_NORMAL, d. h. die Socketoption SO_REUSEADDR ist nicht gesetzt.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!