2012-04-02 20 views
0

OpenSSLとCppに関するいくつかのソースコードに問題があります。何らかの理由でそれはうまく動作しますが、ソケットを開くことはありません! s_clientを使用して接続しようとすると、「接続:エラーなし」と表示されます。netstatを実行するとオープンポートはなくなり、12120のポートを開くはずです。私はあなたの検討のためのWindows 7のおかげを使用しています私のプログラムがうまく何もかもを言うと、それは第二* BIO_do_accept(abio)でのブロッキングを開始!; *あなたはポートが表示されるはずです何を正確にあなたがここに期待しているエラーのあるCpp OpenSSLサーバーのソース

#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); 
} 
+0

プログラムにはprintfがいくつかあります。あなたはどこまで手に入りますか?あなたのプログラムの出力とおそらくクライアントの出力であなたの投稿を更新してください。 – ixe013

+0

私のプログラムはeverythingsがうまくいっていると言い、2回目にブロックを開始します* BIO_do_accept(abio); *私は本当にここにこだわっています! – Confident

答えて

0

? 12120がLISTENING状態になると、クライアントが接続できるようになります。サーバーは別の受け入れを行い、受け入れられたポートでI/Oを読み取れなくなり、最終的にクライアントもブロックされます。 2つの受け入れを続けていますが、あなたのコードです。

+0

2回目の受け入れをヒットするまでブロックしないので、acceptを2回コールします。ご意見ありがとうございますが、netstatを実行すると、ポート12120はまったく表示されません!私のソースをもう一度見て、私のソケットからすべてのSSLを取り除く前に、もう少し洞察力を与えてもらえますか? – Confident

+2

@ user1220811次に、非ブロッキングの最初の「受け入れ」が解決しなければならない問題です。最初に動作しなかったために何かを2回実行し、結果として生じる無効なプログラムをデバッグしようとするのは、合理的な戦略ではありません。 – EJP

0

BIO_do_accept()のOpenSSLドキュメントから:

BIO_do_accept()には2つの機能があります。最初に呼び出されたときに、 の受け入れBIOがセットアップされた後、それは受諾 ソケットを作成し、そのソケットにアドレスをバインドしようとします。 への2回目以降の呼び出しでは、BIO_do_accept()は着信接続を待機するか、または再試行を非ブロックモードの に要求します。

関連する問題