2

私は現在、ブーストを試してみていじっています。単純なマルチスレッドエコーサーバーを作成しようとすると、エラーコード3で受信すると終了します。ドキュメントを何度も調べましたが、まだうまくいきません。私はそれがおそらく私が見落としている非常に単純なものであることを知っています。私はwinsockでまともな経験がありますが、Boostライブラリを学びたいと思います。

これが失敗したコードです

typedef boost::shared_ptr<tcp::socket> socket_ptr;
boost::asio::io_service io;
boost::array<char, 512> buf;

void startserver ( std::string host, std::string port )
{
    tcp::acceptor a (io, tcp::endpoint(tcp::v4(), atoi(port.c_str())));
    for(;;)
    {
        socket_ptr sock (new tcp::socket(io));
        a.accept(*sock);
        std::cout << sock->remote_endpoint() << std::endl;
        boost::thread t (boost::bind(session, sock));
     }
}

void session ( socket_ptr sock ) 
{
    sock->send(boost::asio::buffer("welcome"),0,er);
    size_t len;
    for(;;)
    {
        len = sock->receive(boost::asio::buffer(buf));

        sock->send(boost::asio::buffer(buf,len),0,er);
    }

}

netcatで正常に接続でき、ウェルカムメッセージを受信しますが、受信するとすぐにクラッシュします。それぞれにboost::system :: error_codeを使用してエラーをキャッチしようとしましたが、何も返されませんでした

4

2 に答える 2

5

問題が多すぎます。正しい例については、asio のドキュメントを確認してください。問題のいくつか:

  1. boost::threadオブジェクトを作成tし、すぐにスコープを終了します。これによりスレッドが切り離され、現在は制御できません。または、Joachim Pileborgが述べたように、終了する可能性があります (boost::threads にあまり詳しくないので、間違っている場合は修正してください)。
  2. この直後に、新しいアクセプターを開始します。リスニング ポートごとに 1 つのアクセプターのみを保持する必要があります。
  3. これに対してスレッドを作成する意味はまったくありません。それは ASIO です。async を使用してください ;)
  4. receiveデータを待機せず、ASIO が既に持っているパケット データをフェッチするだけです (この場合は正しくありません)。

ブーストサイトで例を確認してください。あなたのケースがtcpエコーサーバーをブロックしていると思います

于 2012-09-24T13:10:37.187 に答える
1

スレッドが範囲外になったことが原因である可能性が最も高いです。boost::threadデストラクタのマニュアルページから:

スレッドが結合可能な場合は、std::terminate を呼び出します。*これを破壊します。

これは、スレッドが開始されると、スレッドが再び制御を取得し、スレッド オブジェクトが破棄されてスレッドが終了するまで、しばらく実行される可能性があることを意味します。startserver

于 2012-09-24T13:11:38.613 に答える