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

相关推荐
智码看视界4 分钟前
C++智能指针全景剖析及面试20问
开发语言·c++·深度学习·面试·内存管理·智能指针
铅笔小新z10 分钟前
【C语言】深入理解指针
c语言·开发语言
Peregrine940 分钟前
C++ - > 类和对象
java·c++·算法
一条泥憨鱼42 分钟前
【从0开始学习计算机网络】| ARP 协议:地址解析,ARP 欺骗,链路层寻址
网络·后端·学习·计算机网络
m0_715674431 小时前
数据分类分级的范式转换:从规则匹配到场景化高准确率一键部署
大数据·网络·人工智能·网络安全
dog2502 小时前
带宽,时延,抖动的不可能三角
网络·tcp/ip
砚凝霜2 小时前
【软考信息安全】第十六章 网络安全风险评估过程与技术方法
网络·安全·web安全
‎ദ്ദിᵔ.˛.ᵔ₎2 小时前
c++11:fuction包装器
开发语言·c++
霍霍的袁3 小时前
【C++】哈希表实现指南:从原理到开放定址法、链地址法的实现
c++·学习·哈希算法·散列表·visual studio
Eloudy3 小时前
MLNX_OFED 的 install.pl 安装流程分析
网络·rdma·roce