Исходный код для сервера Cpp OpenSSL с ошибками - PullRequest
0 голосов
/ 02 апреля 2012

У меня проблема с некоторым исходным кодом, касающимся OpenSSL и Cpp. По какой-то причине он работает нормально, но не открывает сокет! Когда я пытаюсь подключиться к нему с помощью s_client, я получаю «Connect: No Error». Когда я запускаю 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);
}

Ответы [ 2 ]

0 голосов
/ 07 июля 2016

Из документации OpenSSL для BIO_do_accept ():

BIO_do_accept () выполняет две функции. Когда он впервые вызывается, после BIO был настроен, он попытается создать принятие сокет и привязать к нему адрес. Второй и последующие вызовы BIO_do_accept () будет ожидать входящего соединения или запросить попытку в неблокирующем режиме.

0 голосов
/ 02 апреля 2012

Что именно вы ожидаете здесь? Вы должны увидеть порт 12120 в состоянии LISTENING. Ваш клиент должен иметь возможность подключиться. Затем ваш сервер выполнит еще одно подтверждение, что предотвратит чтение любых операций ввода-вывода на принятом порту и в конечном итоге также заблокирует ваш клиент. Я не знаю, почему вы делаете два приема подряд, но это ваш код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...