1

しばらくの間、パケットの状態を保存する必要があります。そこで、unsigned char *として表されるパケットデータを読み取り、このデータを使用してレコードを作成し、そのレコードをリストにしばらく保存します。

これは、レコード内のパケットをchar*またはchar[]として表すためのより良い方法になります。

読み取ったデータ(unsigned char )を両方のオプションにコピーするにはどうすればよいですか:unsignedchar[]とunsignedchar *

パケットを読み取るたびに同じ文字*に読み取られるため、データをコピーする必要があります。そのため、しばらく保存すると、最初にデータをコピーする必要があります。

4

2 に答える 2

10

パケット データがバイナリの場合、データ ストリームに潜在的な NULL 文字が存在する問題を回避するためstd::vectorに、C 関数の 1 つではなく、データの格納に使用することをお勧めします。strXXXほとんどのstrXXX関数は NULL 文字を探し、その操作を切り捨てます。std::stringデータは文字列ではないため、このタスクも避けます。

std::vector<unsigned char> v( buf, buf + datalen );

ベクター コンストラクターはすべてのデータをコピーしbuf[0]buf[datalen - 1]ベクターがスコープ外になるとメモリの割り当てを解除します。v.data()またはを使用して、基になるバッファーへのポインターを取得できます&v[0]

于 2012-08-05T16:23:42.273 に答える
-3

したがって、将来のある時点まで、複数のパケットからのデータをリストに保存する必要があるようです。

それが私だったら、通常 std::string または std::vector を使用します。これにより、割り当ての問題が解消され、一般的に十分に高速になるためです。

char* または char[] を使用する場合は、char* を使用することをお勧めします。「char buf[1024];」のような変数の宣言 スタックに割り当てます。つまり、その関数が戻ると消えます。リストに保存するには、動的に割り当てる必要があるため、「char *buf = new char[packet.size];」のようにします。次に、データをコピーし、ポインターとデータの長さをリストに保存します (または、前に述べたように、長さを個別に保持することを避ける std::string を使用します)。

どのようにデータをコピーしますか?

おそらくmemcpyです。strcpy 関数は、ネットワークの状況で一般的な、ヌル文字を含む可能性のあるデータに問題があります。したがって、次のようなものです:

char *buf = new char[packet_length];
memcpy(buf, packet_data, packet_length);
// Put buf and packet_length into a structure in your list.
于 2012-08-05T16:18:22.490 に答える