每次我想使用它时,是否可以在不重新连接到服务器的情况下使用BIO_puts?
所以,这是使用bio连接服务器的完整过程(代码简化为显示实际概念):
\beast\b
在这个进动后我可以用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
错误
答案 0 :(得分:2)
您的代码有两个主要错误:
首先,您要求服务器在向您发送回复后关闭连接:
GET / HTTP / 1.1
主持人:stackoverflow.com
连接:关闭
如果您要求它关闭连接,服务器将不会尝试读取您的第二个请求或向您发送第二个回复。
但是你的第二个问题要严重得多 - 你根本就没有真正实现过接收HTTP响应。你只是调用BIO_read
并假设它会以某种方式弄清楚HTTP响应是什么。您需要编写代码以接收HTTP协议之后的HTTP响应。否则,您可能会得到部分响应,更糟糕的是,在您的第二次调用中可能会得到一些第一个响应,而某些第二个响应混合在一起。
HTTP版本1.1是一个非常复杂的协议,其规范有很多要求。试图用这种玩具代码伪造它可能会导致比其他任何东西更多的痛苦。为什么不坚持使用HTTP 1.0并避免尝试重用连接,至少在实际拥有一些HTTP代码之前。