1

ネットワーク化されたアプリケーションの場合、動的データを送信する方法は、構造体を (void*) に memcpy することです。これは、std::string に対して行われた場合のように、いくつかの問題を引き起こします。文字列は動的な長さにすることができます。私が持っていたアイデアは、Java の DataOuputStream に似たものを使用することでした。そこでは、任意の変数をそれに渡すことができ、それを (void*) に入れることができました。これができない場合は、クールです。私は構造体をmemcpyするのが本当に好きではありません。それについて何かが完全に正しくないようです。

ありがとう、
ロビー

4

3 に答える 3

1

構造体の memcpy に問題はありません - 構造体が固定サイズのバッファで満たされているのと同じように。そこに動的変数を配置すると、別の方法でシリアル化する必要があります。

そこに std::strings を含む構造体がある場合は、ストリーム演算子を作成し、それを使用してバッファーをフォーマットします。次に、そのバッファをデータ トランスポートに memcpy できます。ブーストがある場合は、Boost::serializeを使用してください。これにより、これらすべてが実行されます (そのリンクには、代替のシリアライゼーション ライブラリへのリンクもあります)。

注: 可変サイズのバッファを渡す通常の方法は、まず長さを送信してから、そのバイト数のデータを送信することです。デリミタが受信されるまでデータが転送される場合があります (そのデータ内のフィールドは、コンマなどの別の文字で区切られます)。

于 2009-08-11T12:48:32.210 に答える
0

この質問には2つの部分があります。-ネットワークを介したデータのシリアル化-構造体をネットワークスタックに渡す方法

ネットワークを介してデータをシリアル化するには、プロトコルが必要です。難しい必要はありません。ASCIIの場合、パケットエンドのようにcr/lfでも可能です。フレームワーク(MFCなど)を使用する場合、シリアル化機能を提供する場合があります。その場合、これをパケットで送信する方法について心配する必要があります。私にとってよく機能するパケット化は次のとおりです。

<length><data_type>[data....][checksum]

この場合、チェックサムはオプションであり、ゼロデータも可能です。たとえば、信号がdata_typeで伝送される場合(つまり、acklnowedgementの場合はAck)。

構造体を使用してmemcpyで作業している場合は、memcpyが浅いコピーのみを作成することを考慮する必要があります。ネットワークを介して送信されると、ポインタは無意味になります。そのポインタからデータを送信する必要があることを理解してください(つまり、文字列の例の内容)

于 2009-08-11T13:26:49.093 に答える