1

私はboost::asioをよりよく学習している最中です。最近では、いくつかの基本的なサーバーアプリケーションで既に使用しています。だから私は基本を(少し)知っていると思います。

しかし、今日、解決できないように見える問題があります。

多数の送信 SSL 接続を確立したいと考えています (100 以上)。このため、私は多くのワーカー スレッドを使用します (そのようにすると、スケーリングが向上することを読んだためです)。これらのワーカー スレッドには、 以外のコードはあまりありませんio_service->run()。最初に boost::asio SSL クライアントの例を使用し、これらのワーカー スレッドをこのソースに追加しました。でmain()これらのワーカー スレッドを開始し、その後、次のように io_service のタスクを投稿します。

int main( int argc, char * argv[] )

    boost::shared_ptr< boost::asio::io_service > io_service(
            new boost::asio::io_service
    );
    boost::shared_ptr< boost::asio::io_service::work > work(
            new boost::asio::io_service::work( *io_service )
    );
    boost::shared_ptr< boost::asio::io_service::strand > strand(
            new boost::asio::io_service::strand( *io_service )
    );

    boost::thread_group worker_threads;
    for( int x = 0; x < 4; ++x )
    {
            worker_threads.create_thread( boost::bind( &WorkerThread, io_service ) );
    }

    io_service->post( boost::bind( &doConnect, io_service, "127.0.0.1", "7777" ) );
    io_service->post( boost::bind( &doConnect, io_service, "192.168.2.3", "7777" ) );

    work.reset();

    worker_threads.join_all();

    return 0;

}

これdoConnect()は、boost::asio SSL クライアントの例にあるメインの元のコードに他なりません。

void doConnect( boost::shared_ptr< boost::asio::io_service > io_service, string host, string port ) {

    boost::asio::ip::tcp::resolver resolver(*io_service);
    boost::asio::ip::tcp::resolver::query query(host, boost::lexical_cast< std::string >( port ));
    boost::asio::ip::tcp::resolver::iterator iterator = resolver.resolve(query);

    boost::asio::ssl::context ctx(boost::asio::ssl::context::sslv23);
    ctx.load_verify_file("server.crt");

    client c(io_service, ctx, iterator);
}

このコードは正常にコンパイルされますが、実行中にOperation canceledエラーが発生します。

私は多くのことを試しました:

  1. このサイトを読んだ後、コード例のコンストラクターにthisポインターがスコープ外になるという問題がある可能性があるというヒントを得たので、使用しようとしましたshared_from_this()。その結果、exception: tr11: weak pointer.

  2. この弱いポインターの問題を取り除くために、コードをコンストラクターから独自のメソッドに移動し、Start()メソッドでオブジェクトが作成された後にこのメソッドを呼び出そうとしましたdoConnect()。結果がなければ、弱いポインターの問題は依然として存在していました。

  3. その後、例のようにコードをコンストラクターに戻し、SSL固有のコードをすべて削除し、通常のソケットタイプに変更して再度実行しました。今、私は元のエラーを再び受け取りました: Operation canceledSSL コードとは何の関係もないようです。

  4. 途中で (ただし、SSL コードがないことは確かです)、ネットワークがないというエラー メッセージも受け取りました。

エラーメッセージ自体またはその理由に関する多くの情報が見つからないため、この問題で誰かが光を当てることができます(ソケットが閉じられているか範囲外である(そして閉じられている)という提案以外に)..

さらに情報が必要な場合は、教えてください。さらにテキストまたはコードを投稿します...

4

1 に答える 1

0

解決済み:問題は、shared_ptr を介してクライアント オブジェクトをインスタンス化していないという単純な (しかし見過ごされている) 事実でした。オプション 1 の試行に戻しました。オブジェクトは現在 shard_ptr であり、弱いポインター例外はなくなり、すべてが正常に機能します。

于 2012-08-12T02:06:51.380 に答える