Wie kann ein Boost Asio SSL-Client ordnungsgemäß heruntergefahren werden?
Der Kunde macht einigessl::stream<tcp_socket>::async_read_some()
/ssl::stream<tcp_socket>::async_write()
Anrufe und irgendwann muss beendet werden, d. h. es muss die Verbindung beendet werden.
Berufungssl::stream<tcp_socket>::lowest_layer().close()
funktioniert, aber (wie erwartet) der Server (aopenssl s_server -state ...
Befehl) meldet einen Fehler beim Schließen der Verbindung.
Wenn man die API betrachtet, scheint es der richtige Weg zu sein, sie aufzurufenssl::stream<tcp_socket>::async_shutdown()
.
Jetzt gibt es grundsätzlich zwei Situationen, in denen ein Herunterfahren erforderlich ist:
1) Kunde ist in derasync_read_some()
Rückruf und reagiert auf einen 'Quit'-Befehl vom Server. Von dort aus anrufenasync_shutdown()
liefert einen 'Short Read'-Fehler im Shutdown-Callback.
Dies ist überraschend, aber nach dem Herum googeln scheint dies ein normales Verhalten zu sein - man muss anscheinend prüfen, ob es sich um einen echten Fehler handelt oder nicht:
// const boost::system::error_code &ec
if (ec.category() == asio::error::get_ssl_category() &&
ec.value() == ERR_PACK(ERR_LIB_SSL, 0, SSL_R_SHORT_READ)) {
// -> not a real error, just a normal TLS shutdown
}
Der TLS-Server scheint jedoch zufrieden zu sein - er meldet:
DONE
shutting down SSL
CONNECTION CLOSED
2) Aasync_read_some()
ist aktiv - aber ein Benutzer entscheidet sich, den Client zu verlassen (z. B. über einen Befehl von stdin). Beim anrufenasync_shutdown()
Aus diesem Zusammenhang ergibt sich folgendes:
async_read_some()
Callback wird mit einem 'Short Read'-Fehlercode ausgeführt - wird jetzt erwartetdasasync_shutdown()
Rückruf wird mit a ausgeführtentschlüsselung fehlgeschlagen oder fehlerhafte aufzeichnung mac Fehlercode - das ist unerwartetDie Serverseite meldet keinen Fehler.
Also meine Frage, wie man einen TLS-Client mit boost asio richtig herunterfährt.