数据包结构定义
以web服务器将html文件发送给客户机为例:
如何定义数据包结构?
- 数据包长度不固定,可长可短
- 需支持头部的添加和移除
- 简单易于使用
数据包结构代码实现
#define XNET_CFG_PACKET_MAX_SIZE 1516
typedef struct _xnet_packet_t{
uint16_t size; //包中有效数据大小
uint8_t *data; //包的数据起始地址
uint8_t payload[XNET_CFG_PACKET_MAX_SIZE]; //最大负载数据量
}x_net_packet_t;
x_net_packet_t *xnet_alloc_for_send(uint16_t data_size);
x_net_packet_t *xnet_alloc_for_read(uint16_t data_size);
发送函数&接收函数
static x_net_packet_t tx_packet, rx_packet;
x_net_packet_t *xnet_alloc_for_send(uint16_t data_size)
{
tx_packet.data = txpacket.payload + XNET_CFG_PACKET_MAX_SIZE - data_size;
tx_packet.size = data_size;
return &tx_packet;
}
x_net_packet_t *xnet_alloc_for_read(uint16_t data_size)
{
rx_packet.data = rxpacket.payload + XNET_CFG_PACKET_MAX_SIZE - data_size;
rx_packet.size = data_size;
return &rx_packet;
}
添加包头
static void add_header(xnet_packet_t *packet, uint16_t header_size)
{
packet->data -= header_size;
packet->size += header_size;
}
移除包头
static void remove_header(xnet_packet_t *packet, uint16_t header_size)
{
packet->data += header_size;
packet->size -= header_size;
}
截断包头
static void truncate_header(xnet_packet_t *packet, uint16_t size)
{
packet->size = min(packet->size, size);
}