网络当中数据传输流程:
封装&解封装
如何定义数据结构


以太网底层所有数据+包头最大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,今天的你就到此为止吧,明天还要接着🐺啊!
