0

次の構造体があり、ネットワークを介して別のアプリケーションに送信しようとしています

 struct protocol
  {

     char protocol;
     char field1;
     char field2;
     char field3;
     char field4;
     char field5;
     char field6;
     char field7;
     char field8;
     char msg_id;
     char msg_length;
     char *msg;

  };

私が抱えている問題は、文字列を指すポインタがあり、バッファリングする構造体が機能しないため、この構造体をネットワーク経由で送信する方法がわからないことです。これが唯一の方法です。それをするために?

memcpy (buffer, protocol->protocol, char)
memcpy (buffer, protocol->field1, char)
...
memcpy (buffer, protocol->msg, protocol->length)

次に、バッファを送信します

4

3 に答える 3

0

はい、自分のプロセスの外にあるものに送信する場合は、そのようなマーシャリングまたはシリアル化が唯一の実行可能な方法です。

于 2012-12-22T00:16:52.830 に答える
0

構造をある種のバッファにシリアル化する必要があります。コピーのシーケンスは、概念上のみ正しいものです。解決すべき無数の詳細があります:

char buffer[sizeof(struct protocol) + protocol->msg_length]; // Over-allocation

buffer[0] = protocol->protocol;
buffer[1] = protocol->field1;
...
buffer[8] = protocol->field8;
buffer[9] = protocol->msg_id;
buffer[10] = protocol->msg_len;
memcpy(&buffer[11], protocol->msg, protocol->msg_len);

これで、送信するバッファ()の正しい長さを書き込むことができ11 + protocol->msg_lenます。

これは特に簡単です。心配するエンディアンの問題はありません。short一般に、またはintまたはのようなマルチバイト値でlong longは、送信されるバイト順序について心配する必要があります。

于 2012-12-22T00:20:36.220 に答える
0

「msg_lenはXバイトを超えることはありません」など、送信するデータの特定の側面を制限できる場合は、次のようにすることができます。

#define MAX_MSG_LEN 1000
struct protocol
{
 char protocol;
 char field1;
 char field2;
 char field3;
 char field4;
 char field5;
 char field6;
 char field7;
 char field8;
 char msg_id;
 char msg_length;
 char msg[MAX_MESSAGE_LEN];
};

msgの前にどれだけのオーバーヘッドがあるかを計算してから、msg_lengthを使用して、送信する必要のあるバッファーの合計サイズを決定する必要があります。

または、別の方法は次のとおりです。

struct protocol
{
 char protocol;
 char field1;
 char field2;
 char field3;
 char field4;
 char field5;
 char field6;
 char field7;
 char field8;
 char msg_id;
 char msg_length;
 char msg[1];
};

そしてstruct procotol *msg_ptr = malloc(sizeof(struct protocol) + msg_len-1);、メッセージを作成する必要があるときに使用します。

これらの方法には両方とも、構造体に「ギャップ」がある場合、もう一方の端でそれに対処する必要があるという欠点があります(別のコンパイラでコンパイルした場合、別のプロセッサで、ギャップのルールが異なる場合があります。または単に異なるコンパイラスイッチを使用して)

于 2012-12-22T00:33:41.300 に答える