2012-05-07 9 views
2

私はtcpクライアント経由でデータを読み込む必要がありますが、毎回1つのtcpパケットデータを読み込む必要があります。非同期ブーストでパケットデータを1つだけ読み取る方法は?

私はコードusethis:

 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つのパケットデータを読み取るためにそれを変更する必要がある複数のpacket.howを読みますか?

+4

TCPはIPの上にあるストリームプロトコルなので、IP自体とは異なり、パックベースではありません。 – MSalters

+0

TCPを使用していて「パケット」を考慮している場合は、間違っています。おそらく、私たちにあなたの最終目標を教えてくれるかもしれません。 – ereOn

+0

@MSaltersはいわかっています。しかし、データを送信する際には、nodelayがデータを読み取るための手段であることが旗ですか? –

答えて

3

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

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

0

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

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

また、複数のパケットを読み取らせてください。そのパケットを処理します。最初のパケットを処理した後、パケットが読み込まれたかどうかを判断し、そうであればパケットバッファの先頭にmemcpyを書き込みます。あなたのバッファにパケット全体がある場合は、もしそうでなければ、あなたのmemcpyがどこで終了したのかを最後に読んでください。

1

TCPはパケット指向ではありません。データのストリームです。パケットは、任意の側で一緒にマージすることができます。私は以下の技術を使用してパケットを読み取ります:

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

たとえば、パケットのリーダのみを読み取る。今、私は、非同期読み取りハンドラで完全な論理パケット長を持っているので、私はasio::read論理パケットの残りの部分を読み取るバイトの正確な数です。再びasync_readをセットアップして次のパケットヘッダーを待つ。

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

関連する問題