数据包结构定义
文章目錄
- 1 數據包結構定義
- 1.1 數據包的結構
- 1.2 代碼實現
1 數據包結構定義
1.1 數據包的結構
通信過程中數據包的傳遞如下:
我們改如何定義數據包結構呢?
- 數據包長度不固定,可長可短。
- 需支持頭部的添加和移除。
- 簡單易于使用。
數據包結構如下:
1.2 代碼實現
首先看下整個工程文件的組成:
xnet_tiny.h中添加如下內容:
#ifndef XNET_TINY_H #define XNET_TINY_H#include <stdint.h>#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]; // 最大負載數據量 }xnet_packet_t;xnet_packet_t * xnet_alloc_for_send(uint16_t data_size); xnet_packet_t * xnet_alloc_for_read(uint16_t data_size);void xnet_init (void); void xnet_poll(void);#endif // XNET_TINY_Hxnet_tiny.c中添加如下內容:
#include "xnet_tiny.h"#define min(a, b) ((a) > (b) ? (b) : (a))static xnet_packet_t tx_packet, rx_packet; // 接收與發送緩沖區/*** 分配一個網絡數據包用于發送數據* @param data_size 數據空間大小* @return 分配得到的包結構*/ xnet_packet_t * xnet_alloc_for_send(uint16_t data_size) {// 從tx_packet的后端往前分配,因為前邊要預留作為各種協議的頭部數據存儲空間tx_packet.data = tx_packet.payload + XNET_CFG_PACKET_MAX_SIZE - data_size;tx_packet.size = data_size;return &tx_packet; }/*** 分配一個網絡數據包用于讀取* @param data_size 數據空間大小* @return 分配得到的數據包*/ xnet_packet_t * xnet_alloc_for_read(uint16_t data_size) {// 從最開始進行分配,用于最底層的網絡數據幀讀取rx_packet.data = rx_packet.payload;rx_packet.size = data_size;return &rx_packet; }/*** 為發包添加一個頭部* @param packet 待處理的數據包* @param header_size 增加的頭部大小*/ static void add_header(xnet_packet_t *packet, uint16_t header_size) {packet->data -= header_size;packet->size += header_size; }/*** 為接收向上處理移去頭部* @param packet 待處理的數據包* @param header_size 移去的頭部大小*/ static void remove_header(xnet_packet_t *packet, uint16_t header_size) {packet->data += header_size;packet->size -= header_size; }/*** 將包的長度截斷為size大小* @param packet 待處理的數據包* @param size 最終大小*/ static void truncate_packet(xnet_packet_t *packet, uint16_t size) {packet->size = min(packet->size, size); }/*** 協議棧的初始化*/ void xnet_init (void) { }/*** 輪詢處理數據包,并在協議棧中處理*/ void xnet_poll(void) { }app.c:
#include <stdio.h> #include "xnet_tiny.h"int main (void) {xnet_init();printf("xnet running\n");while (1) {xnet_poll();}return 0; }總結
- 上一篇: 本地套接字编程
- 下一篇: StaticLinkList