日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据包结构定义

發布時間:2025/4/5 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据包结构定义 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 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_H

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

總結

以上是生活随笔為你收集整理的数据包结构定义的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。