理论部分



对方检查校验和出现问题就直接丢包了,不会给我们回应,但是可以使用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不可达响应截图
