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

相关推荐
2301_816651224 分钟前
C++中的享元模式变体
开发语言·c++·算法
m0_583203137 分钟前
C++中的访问者模式变体
开发语言·c++·算法
浅念-14 分钟前
C ++ 智能指针
c语言·开发语言·数据结构·c++·经验分享·笔记·算法
不染尘.15 分钟前
最小生成树算法
开发语言·数据结构·c++·算法·图论
成空的梦想21 分钟前
ZLibrary反爬机制实战分析的技术文章大纲
网络协议·https·ssl
二进制person25 分钟前
JavaEE初阶 --网络初识
运维·服务器·网络
NX-二次开发30 分钟前
UG CAM API 获取、设置切削层中的切削方式类型方法,如设置仅底面、恒定、临界深度的类型
c++
李&@杰38 分钟前
《中小型企业网络完整项目方案(拓扑+配置+说明+验收清单)》
网络
祝大家百事可乐40 分钟前
嵌入式——02 数据结构
c++·c#·硬件工程
Yu_Lijing42 分钟前
基于C++的《Head First设计模式》笔记——生成器模式
c++·笔记·设计模式