手写TCP/IP协议栈——数据包结构定义

网络当中数据传输流程:

封装&解封装

如何定义数据结构

以太网底层所有数据+包头最大1514B,可以再添加2B的CRC,一共1516B

数据包的数据结构定义:

cpp 复制代码
#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;


#endif // XNET_TINY_H

数据包发送和读取:

cpp 复制代码
#include "xnet_tiny.h"

static xnet_packet_t tx_packet, rx_packet;

xnet_packet_t* xnet_alloc_for_send(uint16_t data_size)
{
	tx_packet.data = tx_packet.payload + XNET_CFG_PACKET_MAX_SIZE - data_size;
	tx_packet.size = data_size;
	return &tx_packet;
}
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;
}

添加包头,移除包头,截断数据包的函数:

cpp 复制代码
#define min(a,b) ((a)>(b)?(b):(a))

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_packet(xnet_packet_t* packet, uint16_t size)
{
	packet->size = min(packet->size, size);
}

xnet_tinny.h

协议栈初始化

轮询处理数据包,并在协议栈中处理

cpp 复制代码
void xnet_init(void);
void xnet_poll(void);

app.c

poll查询

使用while(1)轮询网卡上有没有数据,一旦硬件(例如以太网网卡)检测到有数据到来,就会交给以太网协议并继续向上交付处理

cpp 复制代码
int main (void) 
{
    xnet_init();
    printf("xnet running\n");
    while (1)
    {
        xnet_poll();
    }
    return 0;
}

ok,今天的你就到此为止吧,明天还要接着🐺啊!

相关推荐
小保CPP7 小时前
OpenCV C++将多张图像合并为webp动图
c++·人工智能·opencv·计算机视觉
见合八方7 小时前
【噪声系数】高偏SOA噪声系数测试方法
网络·自动化·soa·光通信·激光雷达·半导体光放大器
爱刷碗的苏泓舒7 小时前
C 语言 if-else 与 switch-case 分支语句对比
c语言·开发语言
无相求码7 小时前
指针的5层境界,从入门到劝退:C语言指针进阶全解析
c语言
ZKNOW甄知科技7 小时前
燕千云深度集成飞书:以AI之力,开启无感IT运维体验
大数据·运维·网络·数据库·人工智能·低代码·集成学习
nVisual7 小时前
数据中心机柜负载均衡与三相相位监控方案
运维·网络·负载均衡·数据中心布线·综合布线管理软件
乐观勇敢坚强的老彭7 小时前
信奥C++一维数组笔记
开发语言·c++·笔记
码上有光7 小时前
异常和智能指针
java·大数据·c++·servlet·异常·智能指针
对讲机数码科普7 小时前
黑龙江应急救援单工通信保障方案设计与实战应用
大数据·网络·人工智能
Helen_cai7 小时前
EntryAbility 全局初始化 + 网络请求 HttpUtil 完整源码
网络·华为·harmonyos