柔軟な配列メンバーの代わりにマクロを使用する必要がありますか?

j3141592653589793238

次のことを想定しましょう。

UDPパケットの構造を作成したいと思います各フレームは通常、イーサネットヘッダー、IPヘッダー、UDPヘッダー、オプションのペイロードで構成され、最後にFCS(フレームチェックサムシーケンス)が続きます。
ペイロードの長さは不明/柔軟です。つまり、構造体を作成するとき、ペイロードはその最後のメンバー(柔軟な配列メンバー)である必要があります。したがって、FCSの場所はありません。

そこで、どんな可能性が残るのか考えました。

私は次のコードを思いついた:

#define UDP_PKT(name, payload_length) struct __attribute((__packed__))      \
    {                                                                       \
        struct ether_header eth;                                            \
        struct ip iph;                                                      \
        struct udphdr udph;                                                 \
        unsigned char payload[payload_length];                              \
        u_int32_t fcs;                                                      \
    } name;

これは許可されていないため:

struct __attribute__((__packed__)) udp_packet
{
    struct ether_header eth;
    struct ip iph;
    struct udphdr udph;
    unsigned char payload[]; // fam, must always be the last member
    u_int32_t fcs;
};

私の質問:固定配列(ペイロード)サイズを持たずに構造にFCSを含める必要がある唯一の可能性はありますか?

もしそうなら、それは良い解決策ですか?それは良い習慣と考えられていますか?

セルゲイ・カリニチェンコ

structフレキシブル配列メンバーのサイズは実行時に決定されるため、最初のアプローチも機能しません。解決策はstruct、ワイヤー用にシリアル化する準備ができたら、FCSをバッファーの最後に配置することです

struct __attribute__((__packed__)) udp_packet {
    struct ether_header eth;
    struct ip iph;
    struct udphdr udph;
    u_int32_t fcs;
    unsigned char payload[]; // Move fcs up
};

void serialize_udp_packet(const udp_packet* p) {
    // Compute buffer size, and allocate the buffer
    // Place the header into the buffer
    // Copy the payload into the buffer
    // Place FCS into the buffer at the end
}

完全に除外fcsして、udp_packetをシリアル化した場合にのみ計算することもできますstructこのアプローチの利点の1つはFCS、変更されたペイロードに常に同期しなくても、ペイロードを自由に変更できることです

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

柔軟な配列メンバーは未定義の動作につながる可能性がありますか?

分類Dev

柔軟な配列メンバーは未定義の動作につながる可能性がありますか?

分類Dev

柔軟な配列メンバーは未定義の動作につながる可能性がありますか?

分類Dev

配列を使用し、構造体にメモリを割り当てます(柔軟な配列メンバー)

分類Dev

Cの構造体に複数の柔軟な配列がありますか?

分類Dev

関数の代わりにマクロを使用すると、バイナリが大きくなりますか?

分類Dev

HTTPリクエストにペイロードを送信する必要がある場合、DELETEの代わりにPUTを使用する必要がありますか?

分類Dev

2D配列のmmap()を使用して共有メモリを初期化していますが、後続のポインタのメモリもマップする必要がありますか?代わりにshmを使用する必要がありますか?

分類Dev

ConcurrentLinkedQueueの代わりに、ロック付きのLinkedListを使用する必要がありますか?

分類Dev

ドメインの代わりに列挙型を使用する必要があるのはいつですか?

分類Dev

JS配列の値をループし、値を削除する場合、forの代わりにwhileを使用する必要がありますか?

分類Dev

プロローグ-「= \ =」の代わりに「dif」を使用する必要があるのはなぜですか

分類Dev

nodejsのコンソールの代わりに他に何を使用する必要がありますか?

分類Dev

共用体のrawバイトにアクセスするための柔軟な配列メンバー

分類Dev

Makefileでターゲットの依存関係を柔軟に定義する必要があります

分類Dev

WebAPIコントローラーでTask <ActionResult <IEnumerable <T >>>の代わりにIAsyncEnumerable <T>を使用できますか(または使用する必要があります)

分類Dev

PHP:インデックスを再作成する代わりに、キーを保持しながら2つの配列をマージしますか?

分類Dev

柔軟な配列メンバーを使用して構造体の配列を適切に割り当てる方法は?

分類Dev

データが変更されない場合、Reactコンポーネントで状態を使用することは悪い習慣ですか?代わりに、クラスのプロパティを使用する必要がありますか?

分類Dev

柔軟な配列メンバーを使用してスタックを実装する

分類Dev

繰り返しのget / setステートメントの代わりにクラスを作成する必要がありますか?

分類Dev

安全で柔軟なアプリエンジン->クラウド機能通信のためにどのサービスアカウント権限を設定する必要がありますか

分類Dev

char配列の各メンバーを明示的に作成する必要がありますか?

分類Dev

joda-timeの代わりにthreetenを使用する必要がありますか

分類Dev

getString()の代わりにJDBC getNString()を使用する必要がありますか?

分類Dev

Kotlin:varの代わりにvalを使用する必要がありますか?

分類Dev

新しいC ++コードはアロケータの代わりにメモリリソースを使用する必要がありますか?

分類Dev

__init __()を使用する代わりにメソッドを使用する必要があるのはなぜですか?

分類Dev

多数のifステートメントを使用する代わりに効率的な回避策はありますか?

Related 関連記事

  1. 1

    柔軟な配列メンバーは未定義の動作につながる可能性がありますか?

  2. 2

    柔軟な配列メンバーは未定義の動作につながる可能性がありますか?

  3. 3

    柔軟な配列メンバーは未定義の動作につながる可能性がありますか?

  4. 4

    配列を使用し、構造体にメモリを割り当てます(柔軟な配列メンバー)

  5. 5

    Cの構造体に複数の柔軟な配列がありますか?

  6. 6

    関数の代わりにマクロを使用すると、バイナリが大きくなりますか?

  7. 7

    HTTPリクエストにペイロードを送信する必要がある場合、DELETEの代わりにPUTを使用する必要がありますか?

  8. 8

    2D配列のmmap()を使用して共有メモリを初期化していますが、後続のポインタのメモリもマップする必要がありますか?代わりにshmを使用する必要がありますか?

  9. 9

    ConcurrentLinkedQueueの代わりに、ロック付きのLinkedListを使用する必要がありますか?

  10. 10

    ドメインの代わりに列挙型を使用する必要があるのはいつですか?

  11. 11

    JS配列の値をループし、値を削除する場合、forの代わりにwhileを使用する必要がありますか?

  12. 12

    プロローグ-「= \ =」の代わりに「dif」を使用する必要があるのはなぜですか

  13. 13

    nodejsのコンソールの代わりに他に何を使用する必要がありますか?

  14. 14

    共用体のrawバイトにアクセスするための柔軟な配列メンバー

  15. 15

    Makefileでターゲットの依存関係を柔軟に定義する必要があります

  16. 16

    WebAPIコントローラーでTask <ActionResult <IEnumerable <T >>>の代わりにIAsyncEnumerable <T>を使用できますか(または使用する必要があります)

  17. 17

    PHP:インデックスを再作成する代わりに、キーを保持しながら2つの配列をマージしますか?

  18. 18

    柔軟な配列メンバーを使用して構造体の配列を適切に割り当てる方法は?

  19. 19

    データが変更されない場合、Reactコンポーネントで状態を使用することは悪い習慣ですか?代わりに、クラスのプロパティを使用する必要がありますか?

  20. 20

    柔軟な配列メンバーを使用してスタックを実装する

  21. 21

    繰り返しのget / setステートメントの代わりにクラスを作成する必要がありますか?

  22. 22

    安全で柔軟なアプリエンジン->クラウド機能通信のためにどのサービスアカウント権限を設定する必要がありますか

  23. 23

    char配列の各メンバーを明示的に作成する必要がありますか?

  24. 24

    joda-timeの代わりにthreetenを使用する必要がありますか

  25. 25

    getString()の代わりにJDBC getNString()を使用する必要がありますか?

  26. 26

    Kotlin:varの代わりにvalを使用する必要がありますか?

  27. 27

    新しいC ++コードはアロケータの代わりにメモリリソースを使用する必要がありますか?

  28. 28

    __init __()を使用する代わりにメソッドを使用する必要があるのはなぜですか?

  29. 29

    多数のifステートメントを使用する代わりに効率的な回避策はありますか?

ホットタグ

アーカイブ