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

相关推荐
优雅的潮叭6 小时前
c++ 学习笔记之 shared_ptr
c++·笔记·学习
鄭在秀6 小时前
【SD-WAN介绍】
网络·网络安全·sd-wan
Gofarlic_oms16 小时前
Windchill用户登录与模块访问失败问题排查与许可证诊断
大数据·运维·网络·数据库·人工智能
SunkingYang6 小时前
QT中使用Lambda表达式作为槽函数用法,以及捕获列表和参数列表用法与区别
c++·qt·用法·lambda表达式·捕获列表·槽函数·参数列表
SomeBottle7 小时前
【小记】解决校园网中不同单播互通子网间 LocalSend 的发现问题
计算机网络·go·网络编程·学习笔记·计算机基础
微露清风7 小时前
系统性学习C++-第二十二讲-C++11
java·c++·学习
方圆工作室7 小时前
【C语言图形学】用*号绘制完美圆的三种算法详解与实现【AI】
c语言·开发语言·算法
代码村新手8 小时前
C++-类和对象(中)
java·开发语言·c++
qq_254617778 小时前
nslookup 这个命令解析dns,和系统接口gethostbyname解析区别在哪?
linux·网络