手写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,今天的你就到此为止吧,明天还要接着🐺啊!

相关推荐
txinyu的博客10 小时前
C++ 模板元编程 (TMP)
开发语言·c++
dragoooon3410 小时前
C++ 从零实现Json-Rpc 框架
开发语言·c++·rpc
YYYing.10 小时前
【计算机网络 | 第三篇】MAC地址与IP地址
网络·tcp/ip·计算机网络
蜂蜜黄油呀土豆10 小时前
深入理解 TCP 四次挥手及相关网络问题
tcp/ip·计算机网络·连接管理
嘿嘿嘿x310 小时前
网络通信基础知识
网络
这儿有一堆花10 小时前
深入解析 VPC:云端网络架构的核心基石
网络·架构
三万棵雪松11 小时前
【AI小智硬件程序(八)】
c++·人工智能·嵌入式·esp32·ai小智
阿华hhh11 小时前
单片机day1
c语言·单片机·嵌入式硬件
我还可以再学点11 小时前
C语言常见函数
c语言·开发语言
8K超高清11 小时前
2026科技风口:有哪些前沿场景即将落地?
网络·人工智能·科技·数码相机·计算机视觉