2

我正在开发一个网络程序,该程序将处理具有标头部分和有效负载部分的数据包。标头是可变长度的,根据网络条件添加或删除扩展段。用户数据部分是一个普通字节缓冲区,尽管在数据包构建或使用期间它可能被视为某种结构或其他结构。

我希望有一个基类来构建和操作标头,如果需要插入扩展字段,标头字节(可能)向前或向后移动,以及包含用户数据的派生类。例如:

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];
} ;

是否有一种标准方法可以保证hdrandpayload1或之间没有填充payload2,以便我可以传递start()write()让标头和连续有效​​负载传输到网络?例如,如果(sizeof(hdr) % BIG_STANDARD_ALIGNMENT) == 0)then 派生类hdr将在没有任何额外填充的情况下启动?

另一种方法是使用分散/收集 I/O,但这似乎是一个复杂的设置,我不确定将数据包片段收集在一起以在单个 UDP 数据包中传输是否有效。

4

0 回答 0