1

私には2つのケースがあります:

  1. クライアントは接続し、バイトを送信せず、サーバーの応答を待ちます。
  2. クライアントが接続し、1バイト以上を送信して、サーバーの応答を待ちます。

次の問題は次のとおりです。最初のケースでは、バイトを読み取らず、サーバーの応答を取得する必要があります。2番目のケースでは、少なくとも1バイトを読み取る必要があります。そうしないと、サーバーの応答が返されません。次のように、少なくとも0バイトを読み取ろうとすると:

async_read(sock, boost::asio::buffer(data),
            boost::asio::transfer_at_least(0),
            boost::bind(&server::read, this,
                boost::asio::placeholders::error,
                boost::asio::placeholders::bytes_transferred));

2番目のケースでは、適切なサーバー応答を取得できません。

しかし、少なくとも1バイトを読み取った場合、このasync_read操作は終了しません。

では、どうすればこのケースを処理できますか?

更新1:時間制限を使用せずに解決策を探しています。

4

3 に答える 3

3

これがどのように機能すると思いますか?最初のケースと 2 番目のケースで応答は異なりますか? 異なる場合は、競合状態があり、プロトコルを修正する必要があるため、これを確実に行うことはできません。変化しない場合、サーバーは応答を送信するだけです。

この問題の解決策は asio の問題ではありません。

于 2012-07-01T13:56:55.747 に答える
1

これが私がしたことです

 while (ec != boost::asio::error::eof) {

        vector<char>socketBuffer(messageSize);

        size_t buffersize = socket->read_some(
                                    boost::asio::buffer(socketBuffer),ec);

        if (buffersize > 0) {

            cout << "received" << endl;

            for (unsigned int i=0; i < buffersize; ++i) {

                cout << socketBuffer.at(i);
            }

            cout << "" << endl;
        }

        socketBuffer.clear();

    }

    if(!ec){
        cout<<"error "<<ec.message()<<endl;
    }
    socket->close();

これは私のコードの小さなスニペットです。一定量のデータを読み取り、必要に応じてバイトのベクトルに追加して後で処理できるようになることを願っています。

お役に立てれば

于 2012-07-27T11:38:36.713 に答える
0

ケース2で適切なサーバー応答を行うためにクライアントが送信するデータを使用する必要があると思います。ケース1でデフォルトの応答を行う可能性があります。サーバ?サーバーが接続を受け入れた後、特別な限られた時間を待つタイマーを開始する必要があるかもしれません。サーバーが時間内にデータを受信した場合はケース 2 です。時間が経過した場合はケース 1 です。

于 2012-07-01T04:51:56.947 に答える