Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以使用BIO_put,BIO_读取多次而不重新连接吗?_C++_Linux_Ssl_Openssl - Fatal编程技术网

C++ 我可以使用BIO_put,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_puts时,我是否可以在不重新连接服务器的情况下使用它

下面是使用bio连接到服务器的完整过程(代码经过简化以显示实际概念):


在此过程之后,我可以使用
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