手写TCP/IP协议——实现ping的响应

理论部分

本课程中ICMP主要负责2项任务:检查连通性,差错报告,交换路由器之间的信息通信码

代码实现部分

在xnet_tinny.h中添加ICMP协议

cpp 复制代码
typedef enum _xnet_protocol_t
{
	XNET_PROTOCOL_ARP = 0x0806,
	XNET_PROTOCOL_IP = 0x0800,
	XNET_PROTOCOL_ICMP = 1,
}xnet_protocol_t;

xnet_tinny.c中IP协议处理中向上层协议交付可添加ICMP协议的处理部分

cpp 复制代码
#define xipaddr_from_buf(dest,buf) ((dest)->addr = *(uint32_t*)(buf))


switch (iphdr->protocol)
	{
	case XNET_PROTOCOL_ICMP:
		remove_header(packet, header_size);
		ximcp_in(&src_ip, packet);
	default:
		break;
	}

接下来实现xicmp_in函数

铺垫工作:

cpp 复制代码
void xicmp_init(void);
void xicmp_in(xipaddr_t* src_ip, xnet_packet_t* packet);
cpp 复制代码
void xnet_init(void)
{
	ethernet_init();
	xarp_init();
	xip_init();
	xicmp_init();
}

ICMP数据包格式

cpp 复制代码
typedef struct _xicmp_hdr_t
{
	uint8_t type;
	uint8_t code;
	uint16_t checksum;
	uint16_t id;
	uint16_t seq;
}xicmp_hdr_t;
cpp 复制代码
#define XICMP_CODE_ECHO_REQUEST  8    //ICMP回显请求
#define XICMP_CODE_ECHO_REPLY    0    //ICMP回显响应

xicmp_in函数实现:

cpp 复制代码
void xicmp_in(xipaddr_t* src_ip, xnet_packet_t* packet)
{
	xicmp_hdr_t* icmphdr = (xicmp_hdr_t*)packet->data;
	
	if ((packet->size >= sizeof(xicmp_hdr_t)) && (icmphdr->type == XICMP_CODE_ECHO_REQUEST))
		reply_icmp_request(icmphdr, src_ip, packet);
}

reply_icmp_request函数实现:

cpp 复制代码
static xnet_err_t reply_icmp_request(xicmp_hdr_t* icmp_hdr, xipaddr_t* src_ip, xnet_packet_t* packet)
{
	xicmp_hdr_t* reply_hdr;
	xnet_packet_t* tx = xnet_alloc_for_send(packet->size);

	reply_hdr = (xicmp_hdr_t*)tx->data;
	reply_hdr->type = XICMP_CODE_ECHO_REPLY;
	reply_hdr->code = 0;
	reply_hdr->id = icmp_hdr->id;
	reply_hdr->seq = icmp_hdr->seq;
	reply_hdr->checksum = 0;
	memcpy(((uint8_t*)reply_hdr) + sizeof(xicmp_hdr_t), ((uint8_t*)icmp_hdr) + sizeof(xicmp_hdr_t),
		packet->size - sizeof(xicmp_hdr_t));
	reply_hdr->checksum = checksum16((uint16_t*)reply_hdr, tx->size, 0, 1);

	return xip_out(XNET_PROTOCOL_ICMP, src_ip, tx);
}

测试部分

相关推荐
Once_day2 分钟前
C++之《程序员自我修养》读书总结(1)
c语言·开发语言·c++·程序员自我修养
Trouvaille ~12 分钟前
【Linux】TCP Socket编程实战(一):API详解与单连接Echo Server
linux·运维·服务器·网络·c++·tcp/ip·socket
liann11913 分钟前
3.1_网络——基础
网络·安全·web安全·http·网络安全
三水不滴23 分钟前
计网:输入网址到网页显示
经验分享·笔记·计算机网络
坚果派·白晓明24 分钟前
在鸿蒙设备上快速验证由lycium工具快速交叉编译的C/C++三方库
c语言·c++·harmonyos·鸿蒙·编程语言·openharmony·三方库
独行soc25 分钟前
2026年渗透测试面试题总结-17(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
辣香牛肉面26 分钟前
Wireshark v4.6.2 开源免费网络嗅探抓包工具中文便携版
网络·测试工具·wireshark
全栈工程师修炼指南29 分钟前
Nginx | stream 四层反向代理:SSL、PREREAD 阶段模块指令浅析与实践
运维·网络·网络协议·nginx·ssl
小镇敲码人31 分钟前
深入剖析华为CANN框架下的Ops-CV仓库:从入门到实战指南
c++·python·华为·cann
科技块儿34 分钟前
利用IP查询在智慧城市交通信号系统中的应用探索
android·tcp/ip·智慧城市