Wie richten Sie die Verbindung ein timeout Zeitüberschreitung bei Vorgang in OpenSSL
libcurl hat timeout-Optionen wie diese:
CURLOPT_CONNECTTIMEOUT - maximum time in seconds that you allow the connection to the server to take.
CURLOPT_TIMEOUT - maximum time in seconds that you allow the libcurl transfer operation to take.
Möchte ich implementieren, die eine ähnliche timeout-Mechanismus in OpenSSL.
Welche änderungen notwendig wären, die den code unten, so dass ein timeout-Wert wird angewendet, um BIO_do_connect(), BIO_write() und BIO_read()?
Ich bin eine Verbindung zu einem server und dem senden/empfangen von Daten zum/vom server mit BIO_write()/BIO_read (), die OpenSSL zur Verfügung stellt. Mein code basiert auf dem folgenden Beispiel-code verfügbar hier.
int main()
{
BIO * bio;
SSL * ssl;
SSL_CTX * ctx;
int p;
char * request = "GET /HTTP/1.1\x0D\x0AHost: www.verisign.com\x0D\x0A\x43onnection: Close\x0D\x0A\x0D\x0A";
char r[1024];
/* Set up the library */
ERR_load_BIO_strings();
SSL_load_error_strings();
OpenSSL_add_all_algorithms();
/* Set up the SSL context */
ctx = SSL_CTX_new(SSLv23_client_method());
/* Load the trust store */
if(! SSL_CTX_load_verify_locations(ctx, "TrustStore.pem", NULL))
{
fprintf(stderr, "Error loading trust store\n");
ERR_print_errors_fp(stderr);
SSL_CTX_free(ctx);
return 0;
}
/* Setup the connection */
bio = BIO_new_ssl_connect(ctx);
/* Set the SSL_MODE_AUTO_RETRY flag */
BIO_get_ssl(bio, & ssl);
SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
/* Create and setup the connection */
BIO_set_conn_hostname(bio, "www.verisign.com:https");
if(BIO_do_connect(bio) <= 0)
{
fprintf(stderr, "Error attempting to connect\n");
ERR_print_errors_fp(stderr);
BIO_free_all(bio);
SSL_CTX_free(ctx);
return 0;
}
/* Check the certificate */
if(SSL_get_verify_result(ssl) != X509_V_OK)
{
fprintf(stderr, "Certificate verification error: %i\n", SSL_get_verify_result(ssl));
BIO_free_all(bio);
SSL_CTX_free(ctx);
return 0;
}
/* Send the request */
BIO_write(bio, request, strlen(request));
/* Read in the response */
for(;;)
{
p = BIO_read(bio, r, 1023);
if(p <= 0) break;
r[p] = 0;
printf("%s", r);
}
/* Close the connection and free the context */
BIO_free_all(bio);
SSL_CTX_free(ctx);
return 0;
}
Ich bin cross-compiling für ARM auf Ubuntu (Eclipse mit CodeSourcery Lite).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Landete ich etwas wie das folgende (pseudocode):
Können Sie verwenden Sie den gleichen Ansatz für BIO_read() zu.
Finden Sie vielleicht dieser link nützlich.
BIO_read
. Dokumentation Staaten, dassBIO_read
können in der Folge mehrere Aufruferead
potenziell die Blockierung über die bestimmten timeout.Für die Verbindung, @jpen gab die beste Antwort die es gibt. Sie haben, um die BIO als nicht-blockierend, und verwenden Sie
select
für die Bestimmung, ob es angeschlossen ist und/oder zeitlich.Liest sich das ein wenig anders aus. Weil OpenSSL-Puffer entschlüsselten Daten (je nach dem TLS-cipher-suite verwendet),
select
timeout, wenn Sie versuchen, zu Lesen - selbst wenn die Daten tatsächlich verfügbar ist. Die richtige Art und Weise zu behandeln Lesen timeouts überprüfen Sie zuerstSSL_pending
oderBIO_pending
. Wenn die ausstehende Funktion gibt null zurück, dann verwenden Sie zum festlegen eines timeout. Wenn die ausstehende Funktion zurückgibt, die größer als null ist, dann rufen Sie einfachSSL_read
oderBIO_read
oder jede andere schreib-Funktion.Werfen Sie einen Blick auf
SSL_CTX_set_timeout ()
- Funktion, die funktioniert ähnlich wie libcurl istCURLOPT_TIMEOUT
variable:Vom http://www.openssl.org/docs/ssl/SSL_CTX_set_timeout.html :
In Ihrem Fall könnten Sie die folgende Zeile hinzufügen nach dem erstellen ctx-Objekt:
Hoffe, es hilft !
SSL_CTX_set_timeout
undSSL_SESSION_set_timeout
sind das timeout für session-caching und Wiederaufnahme; und nicht einen timeout fürselect
.