2

tcpを介してデータを読み取る必要があるtcpクライアントが1つありますが、毎回1つのtcpパケットデータを読み取る必要があります。

私はこのコードを使用します:

        socket_[socket_index]->async_receive(
            boost::asio::buffer(buf, max_size),
            boost::bind(
              &pipe::handle_read, shared_from_this(),
              boost::asio::placeholders::error,
              socket_index,
              boost::asio::placeholders::bytes_transferred));

しかし、複数のパケットを読み取ることがあります。1つのパケットデータのみを読み取るように変更する必要がありますか?

4

3 に答える 3

3

あなたはできません。ネットワークの概念が混乱しています。TCPはそれよりも高レベルです。

本当に個々のパケットを操作する必要がある場合は、UDPを使用してください。最小限のケースでは、簡単に切り替えることができます。

于 2012-05-07T16:45:53.423 に答える
1

TCPはパケット指向ではありません-データのストリームです。パケットは、どの側でもマージできます。パケットを読み取るために次の手法を使用します。

async_read(sock, asio::buffer(buf, sizeof(packet_header)), ...

たとえば、パケットのリーダーのみを読み取ります。これで、非同期読み取りハンドラーに完全な論理パケット長があるので、asio::read残りの論理パケットを読み取るために正確なバイト数を実行します。async_read次に、次のパケットヘッダーを待機するように再度設定します。

ヘッダーに論理パケット長がない場合、論理パケットがどこで終了するかを検出する方法はありません(TCPの場合)。

于 2012-09-23T05:50:29.633 に答える
0

これを実際に制御する方法は、バッファのサイズではなく、読み取りたいバイト数を渡すことです。

パケットのバイト数は、パケット ヘッダーの標準オフセットに入れることができます。最初にパケット ヘッダーのサイズを読み取ります。次に、パケットのバイト数 (パケット ヘッダーのサイズを差し引いたもの) を取得し、そのバイト数を読み取ります。

または、先に進み、複数のパケットを読み取らせます。そのパケットを処理します。最初のパケットを処理した後、それ以上のパケットが読み取られたかどうかを判断し、読み取られた場合は、パケット バッファの先頭に memcpy します。バッファにパケット全体がある場合は処理し、そうでない場合は、memcpy が終了した場所の最後でさらに読み取ります。

于 2012-05-08T20:55:44.857 に答える