手写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不可达响应截图

相关推荐
Aliex_git2 小时前
HTTP 协议发展整理
笔记·网络协议·http
程芯带你刷C语言简单算法题2 小时前
Day37~求组合数
c语言·开发语言·学习·算法·c
梁辰兴2 小时前
计算机网络基础:吉比特以太网
网络·计算机网络·计算机·以太网·计算机网络基础·梁辰兴·吉比特以太网
范纹杉想快点毕业2 小时前
入门工程师指南:基于CRC校验的通信协议底层C语言实现
c语言·开发语言·mongodb
wbs_scy2 小时前
C++:unordered_map/unordered_set 使用指南(差异、性能与场景选择)
开发语言·c++·哈希算法
没有bug.的程序员2 小时前
微服务网关:从“必选项”到“思考题”的深度剖析
java·开发语言·网络·jvm·微服务·云原生·架构
余衫马2 小时前
突破语言边界:Python 与 C/C++ 集成方案年度深度总结
c++·python·性能优化·年度技术总结
小此方2 小时前
Re: ゼロから学ぶ C++ 入門(八)类和对象·第五篇:時間计算器
开发语言·c++
无限进步_2 小时前
C++ Vector 全解析:从使用到深入理解
开发语言·c++·ide·windows·git·github·visual studio