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

相关推荐
chilix10 小时前
Linux 跨网段路由转发配置
网络协议
祈安_11 小时前
C语言内存函数
c语言·后端
端平入洛1 天前
auto有时不auto
c++
DianSan_ERP2 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
norlan_jame2 天前
C-PHY与D-PHY差异
c语言·开发语言
哇哈哈20212 天前
信号量和信号
linux·c++
多恩Stone2 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
呉師傅2 天前
火狐浏览器报错配置文件缺失如何解决#操作技巧#
运维·网络·windows·电脑
gihigo19982 天前
基于TCP协议实现视频采集与通信
网络协议·tcp/ip·音视频
czy87874752 天前
除了结构体之外,C语言中还有哪些其他方式可以模拟C++的面向对象编程特性
c语言