C++ 如何初始化OpenSSL BIO对象?

C++ 如何初始化OpenSSL BIO对象?,c++,openssl,C++,Openssl,我有一个tcp服务器,它检测传入的SSL连接(请参阅),然后执行以下操作: BIO* initialize(SSL_CTX *context, int socket){ BIO *bio = NULL; SSL *ssl = SSL_new(context); SSL_set_fd(ssl, socket); if (SSL_accept(ssl) == -1){ return NULL; //error } //what do I

我有一个tcp服务器,它检测传入的SSL连接(请参阅),然后执行以下操作:

BIO* initialize(SSL_CTX *context, int socket){
    BIO *bio = NULL;
    SSL *ssl = SSL_new(context);
    SSL_set_fd(ssl, socket);
    if (SSL_accept(ssl) == -1){
        return NULL; //error
    }
    //what do I do here??
    bio = BIO_new_ssl(context, 1); //this seems wrong...
    return bio;
}

我不知道如何创建BIO对象,文档也很混乱。感谢您的帮助。谢谢

这是我的一个老学生项目(大约2006年)的摘录。 我希望它能对这个问题有所启发。 我不使用BIO_new_ssl(),而是使用ssl_set_BIO()

SSL\u CTX*CTX=setup\u server\u CTX(“root.pem”,NULL);
SSL_CTX*SSL=SSL_new(CTX);
if(NULL==ssl){
fprintf(stderr,“创建SSL上下文时出错。\n”)
后悔莫及;
}
BIO*acc=BIO_新_接受(端口);
if(BIO_do_accept(acc)=SSL_accept(SSL)){
fprintf(stderr,“接受SSL连接时出错\n”);
转到终点;
}   
SSL_写入(SSL,SOME_消息,strlen(SOME_消息));
char buf[buf_SIZE+1]={0};
int ret=SSL_read(SSL,buf,buf_SIZE);

if(ret这是我的一个老学生项目(大约2006年)的摘录。 我希望它能对这个问题有所启发。 我不使用BIO_new_ssl(),而是使用ssl_set_BIO()

SSL\u CTX*CTX=setup\u server\u CTX(“root.pem”,NULL);
SSL_CTX*SSL=SSL_new(CTX);
if(NULL==ssl){
fprintf(stderr,“创建SSL上下文时出错。\n”)
后悔莫及;
}
BIO*acc=BIO_新_接受(端口);
if(BIO_do_accept(acc)=SSL_accept(SSL)){
fprintf(stderr,“接受SSL连接时出错\n”);
转到终点;
}   
SSL_写入(SSL,SOME_消息,strlen(SOME_消息));
char buf[buf_SIZE+1]={0};
int ret=SSL_read(SSL,buf,buf_SIZE);

如果(ret我挑战有人找到比OpenSSL更令人困惑的文档。@AdamRosenfield有人曾经告诉我,文档就像性:好的时候,很好;坏的时候,总比没有好。我告诉他们去阅读OpenSSL文档……哦,来吧。实现异步网络I/O usi需要几个小时ng OpenSSL,即使您以前从未使用过它。尽管我根本不会使用BIO:)我要求有人找到比OpenSSL更令人困惑的文档。@AdamRosenfield有人曾经告诉我,文档就像性爱:好的时候,它很棒;坏的时候,它总比没有好。我告诉他们去阅读OpenSSL文档……哦,来吧。使用Op实现异步网络I/O需要几个小时enSSL,即使您以前从未使用过它。尽管我根本不会使用BIO:)这段代码是如何工作的?你不需要调用
BIO\u do\u accept
两次吗?一次绑定到端口,第二次接受实际连接,然后再调用
BIO\u pop
?只需调用一次
BIO\u do\u accept
我认为它就不能工作了。这段代码是如何工作的?你不需要调用
BIO\u do\u accept
twice-一次绑定到端口,第二次在
BIO_pop
之前接受实际连接?只需一次调用
BIO_do_accept
我认为它无法工作。
SSL_CTX *ctx = setup_server_ctx("root.pem", NULL);
SSL_CTX *ssl = SSL_new(ctx);
if (NULL == ssl) {
   fprintf(stderr, "Error creating SSL context.\n")
   goto err;
}
BIO *acc = BIO_new_accept(port);

if (BIO_do_accept(acc) <= 0) {
   fprintf(stderr, "Error accepting connection.\n");
   goto err;
}

BIO *client = BIO_pop(acc);
SSL_set_bio(ssl, client, client);

if (0 >= SSL_accept(ssl)) {
    fprintf(stderr, "Error accepting SSL connection\n");
    goto end;
}   

SSL_write(ssl, SOME_MESSAGE, strlen(SOME_MESSAGE));
char buf[BUF_SIZE + 1]= {0};
int ret = SSL_read(ssl, buf, BUF_SIZE);
if (ret <= 0) { 
   break;
}   

/* do some more stuff */

SSL_get_shutdown(ssl);