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.

7.4 Client-/Server-Beispiel: SMTP <strong>mit</strong> SARTTLS 403<br />

143–151<br />

153–164<br />

166–171<br />

173–184<br />

Schickt der Client schließlich das QUIT-Kommando an den Server, so verabschiedet<br />

sich der Dæmon von seinem Gegenüber <strong>und</strong> verläßt die Verarbeitungsschleife.<br />

Alle unbekannten Kommandos des Clients werden dagegen <strong>mit</strong><br />

der Meldung 500 unknown command quittiert.<br />

Das in Beispiel 7.13 abgebildete Hauptprogramm startet <strong>mit</strong> der zuvor besprochenen<br />

Initialisierung der ssl-Bibliothek <strong>und</strong> des für alle Clientverbindungen<br />

gemeinsamen eingesetzten <strong>SSL</strong>-Kontexts.<br />

Für die Einrichtung eines passiven, horchenden <strong>Sockets</strong> greift das Programm<br />

auf die in Abschnitt 5.1.1 entwickelte tcp_listen()-Funktion zurück. Anders<br />

als bei den BIO-Funktionen kann über tcp_listen() beispielsweise die Länge<br />

der Listen-Queue explizit bestimmt werden.<br />

Im Anschluß erstellt der Dæmon zwei neue BIO-Objekte: ein Accept-BIO <strong>und</strong><br />

ein Puffer-BIO. Das Accept-BIO wird dabei über die BIO_set_fd()-Funktion<br />

<strong>mit</strong> dem zuvor initialisierten passiven Serversocket srv assoziiert. Das Puffer-<br />

BIO dient im weiteren Verlauf als Vorlage für jede neu angenommene Clientverbindung.<br />

Nachdem das BIO <strong>mit</strong>tels BIO_set_accept_bios() als Bauplan<br />

an das Accept-BIO angeheftet wurde, wird jedem von BIO_do_accept() gelieferten<br />

Socket-BIO ein entsprechendes Puffer-BIO vorgeschaltet.<br />

Beispiel 7.13. bio-ssl-smtpsrv.c, Teil 3<br />

153 int main( int argc, char *argv[] )<br />

154 {<br />

155 BIO *bio, *buf, *client;<br />

156 int srv;<br />

157 struct sigaction action;<br />

158<br />

159 /* <strong>SSL</strong>-Bibliothek <strong>und</strong> <strong>SSL</strong>-Kontext initialisieren */<br />

160 if( ! setup_openssl() )<br />

161 {<br />

162 ERR_print_errors_fp( stdout );<br />

163 exit( EXIT_FAILURE );<br />

164 }<br />

165<br />

166 /* horchenden Socket öffnen (passive open) */<br />

167 if( ( srv = tcp_listen( NULL, "587", BACKLOG ) ) < 0 )<br />

168 {<br />

169 printf( "Can’t create listening socket.\n" );<br />

170 exit( EXIT_FAILURE );<br />

171 }<br />

172<br />

173 /* BIO-Objekte erstellen <strong>und</strong> initialisieren */<br />

174 if( ! ( buf = BIO_new( BIO_f_buffer() ) ) ||<br />

175 ! ( bio = BIO_new( BIO_s_accept() ) ) ||<br />

176 ! ( BIO_set_fd( bio, srv, BIO_CLOSE ) ) )<br />

177 {

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!