我正在研究一个网络程序,该程序将处理具有标头部分和有效负载部分的数据包。标头是可变长度的,根据网络条件添加或删除扩展段。用户数据部分是一个纯字节缓冲区,尽管在数据包构建或使用过程中可以将其视为某种结构或其他结构。
我想拥有一个基类来构建和操作标头,如果需要插入扩展字段,则标头字节(可能)向前或向后移动,以及一个包含用户数据的派生类。例如:
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数据包中进行传输。