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.

400 7 Client-/Server-Programmierung <strong>mit</strong> Open<strong>SSL</strong><br />

77–95<br />

97–103<br />

liegen bleiben. Als Rückgabewert liefert send_smtp_response() die Anzahl<br />

der übertragenen Zeichen.<br />

Die build_ssl_chain()-Funktion wurde gegenüber Beispiel 7.9 nur minimal<br />

modifiziert. Anstatt für jede <strong>SSL</strong>-Verbindung einen neuen <strong>SSL</strong>-Kontext zu initiieren,<br />

greift die Funktion auf den bereits erfolgreich initialisierten <strong>und</strong> über<br />

die globale Variable ctx referenzierten Kontext zurück. build_ssl_chain()<br />

erzeugt ein neues <strong>SSL</strong>-BIO, klinkt dieses in der Mitte der übergebenen BIO-<br />

Kette buffer→socket ein, startet das <strong>SSL</strong>-Handshake <strong>und</strong> gibt die neue<br />

Kette buffer→ssl→socket zurück.<br />

Die Funktion handle_client() kümmert sich um die Verarbeitung der Clientanfragen.<br />

Der Funktion wird beim Aufruf das zum jeweiligen Client verb<strong>und</strong>ene,<br />

gepufferte Socket-BIO übergeben. Als erstes wird an den neuen Client<br />

die obligatorische Grußbotschaft über<strong>mit</strong>telt. Die Datenübertragung zwischen<br />

Client <strong>und</strong> Server findet dabei zunächt ungesichert statt.<br />

Beispiel 7.12. bio-ssl-smtpsrv.c, Teil 2<br />

68 int send_smtp_response( BIO *bio, const char *res )<br />

69 {<br />

70 int num;<br />

71<br />

72 if( ( num = BIO_puts( bio, res ) ) > 0 )<br />

73 BIO_flush( bio );<br />

74 return( num );<br />

75 }<br />

76<br />

77 BIO *build_ssl_chain( BIO *bio )<br />

78 {<br />

79 BIO *buf, *ssl;<br />

80<br />

81 /* gepuffertes BIO zur <strong>SSL</strong>-Kommunikation erstellen */<br />

82 if( ( ssl = BIO_new_ssl( ctx, 0 ) ) == NULL )<br />

83 return( NULL );<br />

84<br />

85 /* erst die BIO-Kette "ssl -> socket" <strong>und</strong> da<strong>mit</strong> ... */<br />

86 ssl = BIO_push( ssl, BIO_pop( bio ) );<br />

87 /* die BIO-Kette "buffer -> ssl -> socket" erstellen */<br />

88 ssl = BIO_push( bio, ssl );<br />

89<br />

90 /* Verbindung aufbauen <strong>und</strong> <strong>SSL</strong>-Handshake durchführen */<br />

91 if( BIO_do_handshake( ssl )

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!