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

相关推荐
头疼的程序员几秒前
计算机网络:自顶向下方法(第七版)第六章 学习分享(一)
网络·学习·计算机网络
2502_911679148 分钟前
ZVH4天馈线分析仪:让现场测试效率提升3倍的便携专家
网络
计算机安禾9 分钟前
【数据结构与算法】第4篇:算法效率衡量:时间复杂度和空间复杂度
java·c语言·开发语言·数据结构·c++·算法·visual studio
m0_488633329 分钟前
C++与C语言的区别和联系,及其在不同领域的应用分析
c语言·c++·面向对象·嵌入式系统·系统软件
Oueii15 分钟前
嵌入式LinuxC++开发
开发语言·c++·算法
sw12138915 分钟前
嵌入式C++驱动开发
开发语言·c++·算法
初圣魔门首席弟子17 分钟前
bug2026.03.24
c++·bug
2501_9249526917 分钟前
C++中的适配器模式
开发语言·c++·算法
良木生香21 分钟前
【C++初阶】:C++类和对象(中):类的默认成员函数---万字解说(最主要的四点)
c语言·开发语言·c++
txinyu的博客22 分钟前
解析muduo源码之 TcpServer.h & TcpServer.cc
c++