4

私はこの本を読んNetwork Security with OpenSSLPravir Chandra, Matt Messier and John Viegaいて、OpenSSL を使用して本の例の後に SSL クライアント/サーバー接続を作成しようとしていますが、このエラーが発生し、その理由がわかりません。

これは私のサーバーです:

#include <openssl/bio.h>
#include <openssl/err.h>
#include <openssl/rand.h>
#include <openssl/ssl.h>
#include <openssl/x509v3.h>

#include <pthread.h>

#define PORT            "6001"
#define SERVER          "splat.zork.org"
#define CLIENT          "shell.zork.org"

void handle_error(const char *file, int lineno, const char *msg)
{
    fprintf(stderr, "** %s:%i %s\n", file, lineno, msg);
    ERR_print_errors_fp(stderr);
    exit(-1);
}

void init_OpenSSL(void)
{
    if (!THREAD_setup() || !SSL_library_init())
    {
        fprintf(stderr, "** OpenSSL initialization failed!\n");
        exit(-1);
    }
    SSL_load_error_strings();
}


void do_server_loop(BIO *conn)
{
    int  done, err, nread;
    char buf[80];

    do
    {
        for (nread = 0;  nread < sizeof(buf);  nread += err)
        {
             err = BIO_read(conn, buf + nread, sizeof(buf) - nread);
             if (err <= 0)
                 break;
        }
        fwrite(buf, 1, nread, stdout);
    }
    while (err > 0);
}

void *server_thread(void *arg)
{
    BIO *client = (BIO *)arg;

    pthread_detach(pthread_self(  ));

    fprintf(stderr, "Connection opened.\n");
    do_server_loop(client);
    fprintf(stderr, "Connection closed.\n");

    BIO_free(client);
    ERR_remove_state(0);
}

int main(int argc, char *argv[])
{
    BIO *acc, *client;

    pthread_t tid;

    init_OpenSSL();

    acc = BIO_new_accept(PORT);
    if (!acc)
        handle_error(__FILE__, __LINE__, "Error creating server socket");

    if (BIO_do_accept(acc) <= 0)
        handle_error(__FILE__, __LINE__, "Error binding server socket");

    for (;;)
    {
        if (BIO_do_accept(acc) <= 0)
            handle_error(__FILE__, __LINE__, "Error accepting connection");

        client = BIO_pop(acc);
        pthread_create(&tid, NULL, server_thread, client);
    }

    BIO_free(acc);
    return 0;
}

gcc を使用してソースをコンパイルしています。

$ gcc -o server server.c -lssl -crypto -lpthread -lm
Undefined symbols for architecture i386:
  "_ERR_print_errors_fp", referenced from:
      _handle_error in ccgAll3d.o
  "_THREAD_setup", referenced from:
      _init_OpenSSL in ccgAll3d.o
  "_BIO_read", referenced from:
      _do_server_loop in ccgAll3d.o
  "_BIO_free", referenced from:
      _server_thread in ccgAll3d.o
  "_ERR_remove_state", referenced from:
      _server_thread in ccgAll3d.o
  "_BIO_new_accept", referenced from:
      _main in ccgAll3d.o
  "_BIO_ctrl", referenced from:
      _main in ccgAll3d.o
  "_BIO_pop", referenced from:
      _main in ccgAll3d.o
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status

なぜこれが起こっているのか誰にも教えてもらえますか?

少し前に似たようなものを手に入れ、問題のある関数を定義することで解決しましたが、これはもう機能しません。

Mac OS X 10.6.8 でソースをコンパイルしています。32ビットシステムを使用しているからですか?

これは私がコンパイルしているコマンドですgcc -Wall -lssl -crypto -lpthread -lm -o server server.c

4

2 に答える 2

4

に少し近づきますgcc -o server sslserver.c -pthread -lssl

また、本の正誤表SSL_init_libraryは、そうあるべきだと私たちに知らせていますSSL_library_init

残っている唯一の未定義の参照は「THREAD_setup」です。

于 2013-01-26T21:57:22.357 に答える
1

openssl-library とリンクしていないようです。追加してみる

[..] -lssl [..]

リンク時に他のライブラリに加えて。

gcc-line も不完全なようです:

 gcc -o -lpthread -lm server.c 

引数の-o後には、出力ファイル名が続く必要があります (この場合、ファイル名として「-lpthread」が使用されます。

于 2013-01-26T21:53:09.277 に答える