手写TCP/IP协议栈——实现ping响应不可达

理论部分

对方检查校验和出现问题就直接丢包了,不会给我们回应,但是可以使用wireshark提醒

编辑 -> 首选项 -> 协议 -> IPV4 勾上校验和检查

同时对于TCP和UDP的校验和检查也可以提前勾选上(后面会用到)

代码实现部分

打开Tftp32软件,选择Tftp Client选项,配置目的主机的IP地址,下面几个内容随便填

点击Get之后可以向目的主机发送请求

cpp 复制代码
switch (iphdr->protocol)
	{
	case XNET_PROTOCOL_ICMP:
		remove_header(packet, header_size);
		xicmp_in(&src_ip, packet);
	default:
		xicmp_dest_unreach(XICMP_CODE_PRO_UNREACH, iphdr);
		break;
	}
cpp 复制代码
#define XICMP_TYPE_UNREACH		 3
#define XICMP_CODE_PORT_UNREACH	 3
#define XICMP_CODE_PRO_UNREACH	 2

xnet_err_t xicmp_dest_unreach(uint8_t code, xip_hdr_t* ip_hdr);
cpp 复制代码
xnet_err_t xicmp_dest_unreach(uint8_t code, xip_hdr_t* ip_hdr)
{
	xicmp_hdr_t* icmp_hdr;
	xipaddr_t dest_ip;
	xnet_packet_t* packet;

	uint16_t ip_hdr_size = ip_hdr->hdr_len * 4;
	uint16_t ip_data_size = swap_order16(ip_hdr->total_len) - ip_hdr_size;

	ip_data_size = ip_hdr_size + min(ip_data_size, 8);

	packet = xnet_alloc_for_send(ip_data_size + sizeof(xicmp_hdr_t));
	icmp_hdr = (xicmp_hdr_t*)packet->data;
	icmp_hdr->type = XICMP_TYPE_UNREACH;
	icmp_hdr->code = code;
	icmp_hdr->checksum = 0;
	icmp_hdr->id = 0;
	icmp_hdr->seq = 0;
	memcpy(((uint8_t*)icmp_hdr) + sizeof(xicmp_hdr_t), ip_hdr, ip_data_size);
	icmp_hdr->checksum = 0;
	icmp_hdr->checksum = checksum16((uint16_t*)icmp_hdr, packet->size, 0, 1);
	xipaddr_from_buf(&dest_ip, ip_hdr->src_ip);

	return xip_out(XNET_PROTOCOL_ICMP, &dest_ip, packet);
}

wireshark抓包ICMP不可达响应截图

相关推荐
zhao3266857511 分钟前
静态IP代理固定IP与动态IP的根本差异,账号操作安全性如何体现
网络·网络协议·tcp/ip
Lzg_na5 分钟前
constexpr的优势
c++
王维同学1 小时前
进程模块枚举、映像身份与线程启动地址关联
c++·windows·安全
hold?fish:palm2 小时前
24 回文链表
数据结构·c++·链表
举手2 小时前
Dispatcher模块剖析
linux·c++
依然鸣3 小时前
PTA团体程序设计天梯赛L1真题讲解L1-077-080
开发语言·c++·算法·深度优先·pat考试·图论
库玛西4 小时前
现代 C++ 智能指针全景指南:从 RAII 思想到工业级实践
c语言·开发语言·c++·笔记·面试
AC赳赳老秦5 小时前
风控岗应用:OpenClaw 采集公开司法与经营异常数据,自动生成企业风险评估报告
大数据·c语言·数据库·人工智能·python·php·openclaw
liulilittle5 小时前
无锁并发容器的设计与实现原理
开发语言·c++·set·map·并发·无锁·lock-free
qeen875 小时前
【数据结构】自平衡二叉搜索树各种旋转算法原理解析及AVL树的C++实现
数据结构·c++·算法