C++ 我可以使用BIO_put,BIO_读取多次而不重新连接吗?
每次我想使用BIO_puts时,我是否可以在不重新连接服务器的情况下使用它 下面是使用bio连接到服务器的完整过程(代码经过简化以显示实际概念):C++ 我可以使用BIO_put,BIO_读取多次而不重新连接吗?,c++,linux,ssl,openssl,C++,Linux,Ssl,Openssl,每次我想使用BIO_puts时,我是否可以在不重新连接服务器的情况下使用它 下面是使用bio连接到服务器的完整过程(代码经过简化以显示实际概念): 在此过程之后,我可以使用BIO_put向服务器写入数据,但要从服务器读取数据,我必须再次执行所有连接过程。其他副作用BIO_read将显示timeouterror您的代码有两个主要错误: 首先,您要求服务器在向您发送回复后关闭连接: 获取/HTTP/1.1 主机:stackoverflow.com 连接:关闭 如果您要求服务器关闭连接,服务器将不会尝
在此过程之后,我可以使用
BIO_put
向服务器写入数据,但要从服务器读取数据,我必须再次执行所有连接过程。其他副作用BIO_read
将显示timeout
error您的代码有两个主要错误:
首先,您要求服务器在向您发送回复后关闭连接:
获取/HTTP/1.1主机:stackoverflow.com
连接:关闭 如果您要求服务器关闭连接,服务器将不会尝试读取您的第二个请求或向您发送第二个答复 但是您的第二个问题要严重得多——您根本没有实现接收HTTP响应。您只需调用
BIO_read
,并假设它会以某种方式找出HTTP响应是什么。您需要编写代码以按照HTTP协议接收HTTP响应。否则,您可能会得到部分响应,更糟糕的是,在您的第二次呼叫中,可能会得到一些第一次响应和一些第二次响应混合在一起
HTTP版本1.1是一个非常复杂的协议,其规范有许多要求。试图用这种玩具代码来伪造它可能比其他任何东西都更痛苦。为什么不坚持使用HTTP 1.0并避免重复使用连接,至少在您真正拥有一些HTTP代码之前是这样。请查看。还有,你试过了吗?我添加了code@DOUGLASO.moen粘贴的代码没有显示对
BIO_read
的任何调用,也没有显示任何类型的错误,据我所知。@DavidSchwartz我不知道为什么,但我只能从SSL会话读取一次,因此,我必须再做一次写和读,向我们展示试图读两遍的代码,并解释它是如何失败的。另外,如果你能解释一下你希望第二次阅读做什么,那也会很有帮助。您是否确认服务器发送的数据尚未读取?
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