gpt4 book ai didi

c++ - 有错误的 Cpp OpenSSL 服务器的源代码

转载 作者:太空宇宙 更新时间:2023-11-03 15:05:39 25 4
gpt4 key购买 nike

我对一些关于 OpenSSL 和 Cpp 的源代码有疑问。由于某种原因,它运行良好但没有打开套接字!当我尝试使用 s_client 连接到它时,我得到“连接:无错误”。当我运行 netstat 时,我没有打开端口。它应该在 12120 上打开一个端口。我什至暂时禁用了我的防火墙,但它没有帮助!顺便说一句我正在使用 Windows 7。感谢您的考虑!我的程序只是说一切正常,它在第二个 *BIO_do_accept( abio );*

#include "stdio.h"
#include "string.h"

#include "openssl/bio.h"
#include "openssl/ssl.h"
#include "openssl/err.h"

int password_callback(char *buf, int size, int rwflag, void *userdata)
{
/* For the purposes of this demonstration, the password is "dw" */

printf("*** Callback function called\n");
strcpy(buf, "dw");
return 1;
}

int main()
{
SSL_CTX *ctx;
SSL *ssl;
BIO *bio, *abio, *out, *sbio;

int (*callback)(char *, int, int, void *) = &password_callback;

printf("Secure Programming with the OpenSSL API, Part 4:\n");
printf("Serving it up in a secure manner\n\n");

SSL_load_error_strings();
ERR_load_BIO_strings();
SSL_library_init();
ERR_load_SSL_strings();
OpenSSL_add_all_algorithms();

printf("Attempting to create SSL context... ");
ctx = SSL_CTX_new( SSLv23_server_method() );
if(ctx == NULL)
{
printf("Failed. Aborting.\n");
return 0;
}

printf("\nLoading certificates...\n");
SSL_CTX_set_default_passwd_cb(ctx, callback);
if(!SSL_CTX_use_certificate_file(ctx, "certificate.pem", SSL_FILETYPE_PEM))
{
ERR_print_errors_fp(stdout);
SSL_CTX_free(ctx);
return 0;
}
if(!SSL_CTX_use_PrivateKey_file(ctx, "private.key", SSL_FILETYPE_PEM))
{
ERR_print_errors_fp(stdout);
SSL_CTX_free(ctx);
return 0;
}

printf("Attempting to create BIO object... ");
bio = BIO_new_ssl(ctx, 0);
if(bio == NULL)
{
printf("Failed. Aborting.\n");
ERR_print_errors_fp(stdout);
SSL_CTX_free(ctx);
return 0;
}

printf("\nAttempting to set up BIO for SSL...\n");
BIO_get_ssl(bio, &ssl);
SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);

abio = BIO_new_accept("12120");
BIO_set_accept_bios(abio, bio);

printf("Waiting for incoming connection...\n");

if(BIO_do_accept(abio) <= 0)
{
ERR_print_errors_fp(stdout);
SSL_CTX_free(ctx); SSL_library_init();
BIO_free_all(bio);
BIO_free_all(abio);
return 0;
}

if(BIO_do_accept(abio) <= 0)
{
ERR_print_errors_fp(stdout);
SSL_CTX_free(ctx);
BIO_free_all(bio);
BIO_free_all(abio);
return 0;
}

out = BIO_pop(abio);

if(BIO_do_handshake(out) <= 0)
{
printf("Handshake failed.\n");
ERR_print_errors_fp(stdout);
SSL_CTX_free(ctx);
BIO_free_all(bio);
BIO_free_all(abio);
return 0;
}

BIO_puts(out, "Hello\n");
BIO_flush(out);

BIO_free_all(out);
BIO_free_all(bio);
BIO_free_all(abio);

SSL_CTX_free(ctx);
}

最佳答案

您到底在这里期待什么?您应该看到端口 12120 处于 LISTENING 状态。然后您的客户端应该能够连接。然后您的服务器执行另一个接受,这将阻止它读取接受端口上的任何 I/O,并最终也会阻止您的客户端。我不知道您为什么要连续执行两次接受,但这是您的代码。

关于c++ - 有错误的 Cpp OpenSSL 服务器的源代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9970448/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com