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:

dasasync_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 unerwartet

Die Serverseite meldet keinen Fehler.

Also meine Frage, wie man einen TLS-Client mit boost asio richtig herunterfährt.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage