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.

346 6 Netzwerkprogrammierung <strong>mit</strong> <strong>SSL</strong><br />

auf einer ganzen Menge globaler Datenstrukturen, die es vor konkurrierenden<br />

Zugriffen aus verschiedenen <strong>Threads</strong> zu schützen gilt. Open<strong>SSL</strong> kümmert<br />

sich zwar selbst um den Schutz dieser gemeinsam genutzten Daten, die dazu<br />

notwendigen Schutzpri<strong>mit</strong>iven müssen aber zuvor von der Anwendung über<br />

spezielle Callback-Funktionen eingebracht werden. Da sich da<strong>mit</strong> das Anwendungsprogramm<br />

um die Implementierung geeigneter Callbacks zu kümmern<br />

hat, etwa unter Zuhilfenahme von Pthreads-Mutexen, bleibt Open<strong>SSL</strong> selbst<br />

im Gegenzug systemunabhängig.<br />

Wir implementieren die benötigten Callback-Funktionen im folgenden <strong>mit</strong><br />

der Hilfe der in Kapitel 3 beschriebenen POSIX-<strong>Threads</strong>. Den resultierenden<br />

Quelltext aus den Beispielen 6.2 <strong>und</strong> 6.3 können Sie dann in allen Pthreads-<br />

Programmen <strong>mit</strong> Open<strong>SSL</strong> einsetzen.<br />

Open<strong>SSL</strong> unterscheidet bei der Realisierung des Thread-Supports zwischen<br />

zwei verschiedenen Aufgaben für die Callback-Funktionen, nämlich<br />

1. der Identifizierung des ausführenden <strong>Threads</strong> <strong>und</strong><br />

2. dem gegenseitigen Ausschluß von gemeinsam genutzten Ressourcen.<br />

Mit Hilfe der CRYPTO_set_id_callback()-Funktion wird eine parameterlose<br />

Callback-Funktion thread_id() hinterlegt, die die Thread-ID des aufrufenden<br />

<strong>Threads</strong> als unsigned long zurückgibt. 22 Im Zusammenspiel <strong>mit</strong><br />

POSIX-<strong>Threads</strong> greift man hierbei kanonischerweise auf die pthread_self()-<br />

Funktion zurück. Sofern Open<strong>SSL</strong> <strong>mit</strong>tels der hinterlegten Callback-Funktion<br />

die verschiedenen <strong>Threads</strong> einer Anwendung voneinander unterscheiden kann,<br />

verwaltet es dann z. B. auch für jeden Thread eine separate Error-Queue.<br />

#include<br />

<br />

void CRYPTO_set_id_callback(<br />

unsigned long (*thread_id)( void ) );<br />

int CRYPTO_num_locks( void );<br />

void CRYPTO_set_locking_callback(<br />

void (*lock)( int mode, int n, const char *file,<br />

int line ) );<br />

Für den gegenseitigen Ausschluß wird <strong>mit</strong> CRYPTO_set_locking_callback()<br />

eine Lock-/Unlock-Funktion lock() hinterlegt. Diese Callback-Funktion verwaltet<br />

ein statisch angelegtes Feld von Mutex-Variablen, über welches der<br />

22 Wichtig ist hierbei eigentlich nur, daß der gelieferte Wert den Thread eindeutig<br />

identifiziert, also für den selben Thread über alle Aufrufe von thread_id() hinweg<br />

immer gleich bleibt <strong>und</strong> darüber hinaus für je zwei verschiedene <strong>Threads</strong> auch<br />

tatsächlich unterschiedlich ist.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!