我可以多次使用BIO_puts,BIO_read而无需重新连接吗?

时间:2016-05-02 18:44:29

标签: c++ linux ssl openssl

每次我想使用它时,是否可以在不重新连接到服务器的情况下使用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错误

1 个答案:

答案 0 :(得分:2)

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

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

  

GET / HTTP / 1.1
  主持人:stackoverflow.com
  连接:关闭

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

但是你的第二个问题要严重得多 - 你根本就没有真正实现过接收HTTP响应。你只是调用BIO_read并假设它会以某种方式弄清楚HTTP响应是什么。您需要编写代码以接收HTTP协议之后的HTTP响应。否则,您可能会得到部分响应,更糟糕的是,在您的第二次调用中可能会得到一些第一个响应,而某些第二个响应混合在一起。

HTTP版本1.1是一个非常复杂的协议,其规范有很多要求。试图用这种玩具代码伪造它可能会导致比其他任何东西更多的痛苦。为什么不坚持使用HTTP 1.0并避免尝试重用连接,至少在实际拥有一些HTTP代码之前。