0

既存の TCP エコー クライアント サーバー アプリケーションに SSL 機能を追加しようとしています。

以前の単純なサーバーでは、着信するクライアント接続ごとに新しい子を生成していました。この子には、コマンドライン引数として conn-fd (char*) を渡していました。(下に示された)

execl("./simple_server_instance", conn_fd, NULL);

ここで、安全なサーバーのために、conn_fd の代わりに CYASSL オブジェクト (有効な構造) を渡す必要があります。(下に示された)

ssl = CyaSSL_new(ctx);
CyaSSL_set_fd(ssl, connfd);

ここで「ssl」は、子プロセスに渡す必要があるオブジェクトです。私はそれを達成するために次の方法を試しましたが、うまくいきませんでした。簡単な代替手段はありますか、それともシリアル化の方法を使用する必要がありますか?

  1. ssl オブジェクトを char* に型キャストする

  2. バッファを作成し、構造全体の memcpy を実行します。(下に示された)

unsigned char sslobjbuf[sizeof(ssl)];
memcpy(&sslobjbuf, ssl, sizeof(ssl));
execl("./secure_server_instance", "hello", "25", sslobjbuf, NULL );

SDSD

4

1 に答える 1

1

プロセスを実行execl()すると、実行中のプロセスが実行中のプロセスに完全に置き換えられます。関数のファミリは、生成されたアプリケーションのexecように使用可能になる一連の null で終了する文字列を想定しています。arvg[]このインターフェイスを介して任意のオブジェクトを渡すことはできません。

おそらく代わりに使用したいのはfork、コード/データを親と共有する新しい子プロセスを提供するシステムコールです。のコードは./simple_server_instance、メイン サーバー コードとマージされます。ssl = CyaSSL_new(ctx);親プロセスで呼び出しを実行して、必要なオブジェクトを取得できますforkssl子がオブジェクトを実行している間、親は新しいリクエストを処理し続けることができます。

この制御の流れのようなものがうまくいくかもしれません:

while (1) {
    wait_connection();
    pid_t child_pid = -1;
    ssl = CyaSSL_new(ctx);
    child_pid = fork();
    if (child_pid == 0) {
        /* We're now running the child process which also has access to ssl.
         * Run simple_server_instance handler code
         */
    }
    else {
        /* Code running in parent.  Do housekeeping, save child_pid if necessary.
         * clean up ssl, object, get ready for next connection, handle finished
         * child processes.
         */
    }
}
于 2012-08-16T12:30:17.670 に答える