私は、ヘッダー部分とペイロード部分を持つパケットを処理するネットワーク プログラムに取り組んでいます。ヘッダーは可変長で、ネットワークの状態に応じて拡張セグメントが追加または削除されます。ユーザー データ部分はプレーン バイト バッファですが、パケットの作成中または使用中に何らかの構造として扱われる場合があります。
拡張フィールドを挿入するために必要に応じてヘッダー バイトを (おそらく) 前方または後方にシフトし、ユーザー データを含む派生クラスを使用して、ヘッダーを構築および操作する基本クラスが必要です。例えば:
class hdr {
public:
const void *start( void ) { return uint8_t(pBuf) + sizeof(pBuf) - SIZEOF_HEADER - pExtBytes; }
private:
size_t pExtBytes;
uint32_t pBuf[16]; // header data goes here, shifted to the END of the buffer, adjacent the beginning of the derived class
// NO PADDING HERE!
} ;
class payload1 : public hdr {
public:
private:
uint8_t pData[128];
} ;
class payload2 : public hdr {
public:
private:
uint16_t pData[12];
} ;
とまたはの間にパディングがないことを保証する標準的な方法はありますか? たとえば、の派生クラスが追加のパディングなしで開始される場合はどうなりますか?hdr
payload1
payload2
start()
write()
(sizeof(hdr) % BIG_STANDARD_ALIGNMENT) == 0)
hdr
別の方法として、スキャッター/ギャザー I/O を使用することもできますが、これは複雑なセットアップのように思えます。単一の UDP パケットで送信するためにパケット フラグメントをまとめて収集することがうまくいくかどうかはわかりません。