es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

SSL_read() devuelve 0 y SSL_get_error devuelve 6. ¿Por qué se interrumpe la conexión durante SSL_read()?

Estoy buscando descargar o leer un archivo de un servidor a través de HTTPS, y estoy usando openSSL para ello.

Veo que la conexión tiene éxito, sin embargo, SSL_read() devuelve 0. SSL_get_error() devuelve 6, que se refiere a la macro SSL_ERROR_ZERO_RETURN y parece que es un comportamiento normal, pero no estoy seguro de por qué se cerró la conexión mientras se estaba leyendo algo. ¿Y puede ser por eso que está leyendo 0 bytes?

“`

#define CHECK_NULL(x) if ((x)==NULL) exit (1)
#define CHECK_ERR(err,s) if ((err)==-1) { perror(s); exit(1); }
#define CHECK_SSL(err) if ((err)==-1) { ERR_print_errors_fp(stderr); exit(2); }

void ServerConnectAndRcv(uint8_t <em>str)
{
int err;
int sd;
struct sockaddr_in sa;
SSL_CTX</em> ctx;
SSL* ssl;
char* str;
char buf [4096];
const SSL_METHOD *meth;

<pre><code>SSLeay_add_ssl_algorithms();
meth = TLSv1_2_client_method();
SSL_load_error_strings();
ctx = SSL_CTX_new (meth);

SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);

// create a socket and connect to the server
sd = socket (AF_INET, SOCK_STREAM, 0);
CHK_ERR(sd, "socket");

memset (&sa, '\0', sizeof(sa));
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = inet_addr ("<dirección-ip-del-servidor>"); /* Dirección IP del servidor */
sa.sin_port = htons (<número-de-puerto-del-servidor>); /* Número de puerto del servidor */

ssl = SSL_new (ctx);
CHECK_NULL(ssl);

SSL_set_fd (ssl, sd);

err = SSL_connect (ssl);
CHECK_SSL(err);

// leer desde el servidor
err = SSL_read (ssl, buf, sizeof(buf) – 1);
CHECK_SSL(err);

if (err <= 0)
{
printf ("Error al leer: %d\n", SSL_get_error(ssl, err));
}

buf[err] = '\0';
printf ("Recibido %d bytes\n", err); // Recibido 0 bytes
SSL_shutdown (ssl);
</code></pre>

}
“`</número-de-puerto-del-servidor></dirección-ip-del-servidor>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    La conexión podría haber sido cerrada por el servidor o por alguna otra razón, lo que provocó que SSL_read() devolviera 0. Esto también podría ser la razón por la cual está leyendo 0 bytes. El código de error devuelto por SSL_get_error() indica que la conexión fue cerrada correctamente por el servidor, por lo tanto SSL_ERROR_ZERO_RETURN es un comportamiento normal.

    Para diagnosticar el problema con mayor detalle, puede verificar los registros del servidor para ver si hubo algún error o desconexión durante su conexión SSL. Además, es posible que desee verificar la versión de SSL/TLS y las suites de cifrado negociadas por SSL_connect() para asegurarse de que sean compatibles con el servidor.

Comments are closed.