gpt4 book ai didi

c++ - 我可以在不重新连接的情况下多次使用 BIO_puts、BIO_read 吗?

转载 作者:太空狗 更新时间:2023-10-29 12:12:40 25 4
gpt4 key购买 nike

我可以使用 BIO_puts 而无需每次我想使用它时都重新连接到服务器吗?

因此,这是使用 bio 连接到服务器的完整过程(代码已简化以显示实际概念):

const char * REQUEST_TO_THE_SERVER = "GET / HTTP/1.1\r\nHost: stackoverflow.com \r\nConnection: close\r\n\r\n";

const char * REQUEST_TO_THE_SERVER_2 = "GET /register HTTP/1.1\r\nHost: stackoverflow.com \r\nConnection: close\r\n\r\n";

char BufferForResponce[1000];


BIO *web;
SSL * ssl;
SSL_CTX * ctx;

OpenSSL_add_all_algorithms();
ERR_load_BIO_strings();
ERR_load_crypto_strings();
SSL_load_error_strings();

SSL_library_init();
ctx = SSL_CTX_new(SSLv3_method());
SSL_CTX_set_options(ctx, flags);
BIO * web = BIO_new_ssl_connect(ctx);
BIO_set_conn_hostname(web, "stackoverflow.com:443);
BIO_get_ssl(web, &ssl);
SSL_set_cipher_list(ssl, PREFERRED_CIPHERS);
BIO_new_fp(stdout, BIO_NOCLOSE);
BIO_do_connect(web);
BIO_do_handshake(web);

BIO_puts(web, REQUEST_TO_THE_SERVER , sizeof(REQUEST_TO_THE_SERVER)); // it is normal
BIO_read(web, BufferForResponce, sizeof(BufferForResponce)); // it is normal


BIO_puts(web, REQUEST_TO_THE_SERVER_2 , sizeof(REQUEST_TO_THE_SERVER_2)); // it is normal
BIO_read(web, BufferForResponce, sizeof(BufferForResponce)); // FAILS WITH TIMEOUT

在此过程之后,我可以使用 BIO_puts 写入服务器,但要从服务器读取,我必须再次执行所有连接过程。其他副BIO_read会显示timeout错误

最佳答案

您的代码有两个主要错误:

首先,您要求服务器在向您发送回复后关闭连接:

GET / HTTP/1.1
Host: stackoverflow.com
Connection: close

如果您要求服务器关闭连接,服务器将不会尝试读取您的第二个请求或向您发送第二个回复。

但是你的第二个问题要严重得多——你根本没有真正实现接收 HTTP 响应。您只是调用 BIO_read 并假设它会以某种方式找出 HTTP 响应是什么。您需要编写代码来接收遵循 HTTP 协议(protocol)的 HTTP 响应。否则,您可能会得到部分响应,更糟糕的是,在您第二次调用时,可能会得到一些第一次响应和一些第二次响应混合在一起。

HTTP 1.1 版是一个非常复杂的协议(protocol),其规范有很多要求。试图用这种玩具代码伪造它可能会比其他任何事情都更痛苦。为什么不坚持使用 HTTP 1.0 并避免尝试重新使用连接,至少在您真正拥有一些 HTTP 代码之前。

关于c++ - 我可以在不重新连接的情况下多次使用 BIO_puts、BIO_read 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36989412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com