编程实现发送ICMP协议数据包教程.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编程实现发送ICMP协议数据包教程

ICMP原理与代码及分析 专业: 班级: 学号: 姓名: ICMP协议简介 ICMP全称Internet Control Message Protocol,中文名为因特网控制报文协议。它工作在OSI的网络层,向数据通讯中的源主机报告错误。ICMP可以实现故障隔离和故障恢复。网络本身是不可靠的,在网络传输过程中,可能会发生许多突发事件并导致数据传输失败。网络层的IP协议是一个无连接的协议,它不会处理网络层传输中的故障,而位于网络层的ICMP协议却恰好弥补了IP的缺限,它使用IP协议进行信息传递,向数据包中的源端节点提供发生在网络层的错误信息反馈。ICMP的报头长8字节,结构如图1所示。     比特0     7 8   15 16        比特31 类型(0或8) 代码(0) 检验和 首部其余部分(未使用) 数据 (图1 ICMP报头结构) 类型:标识生成的错误报文,它是ICMP报文中的第一个字段; 代码:进一步地限定生成ICMP报文。该字段用来查找产生错误的原因; 校验和:存储了ICMP所使用的校验和值。 未使用:保留字段,供将来使用,起值设为0 数据:包含了所有接受到的数据报的IP报头。还包含IP数据报中前8个字节的数据; ICMP协议提供的诊断报文类型如表1所示。 种类 类型 描述 差错报文 3 目的端不可达 4 源点抑制 11 超时 12 参数问题 5 改变路由 查询报文 8或0 回显请求或应答 13或14 时间戳请求或应答 17或18 地址掩码请求或应答 10或9 路由询问和通告 (表1 ICMP诊断报文类型) ICMP提供多种类型的消息为源端节点提供网络层的故障信息反馈,它的报文类型可以归纳为以下5个大类: 诊断报文(类型8,代码0;类型0,代码0); 目的不可达报文(类型3,代码0-15); 重定向报文(类型5,代码0-4); 超时报文(类型11,代码0-1); 信息报文(类型12-18)。 二、编程实现发送ICMP协议数据包 代码功能:实现发送ICMP协议数据包,从而实现DOS下ping命令功能。 1.代码简要分析 代码执行步骤: 创建协议类型为IPPROTO_ICMP的原始套接字,设置套接字的属性。 创建并初始化ICMP封包。 调用sendto函数向远程主机发送ICMP的请求。 调用recvfrom函数接受ICMP响应。 初始化ICMP头时先初始化消息的类型和代码域,之后应该是回显请求头。程序首先定义了ICMP头的数据结构ICMP_HDR。 typedef struct icmp_hdr { unsigned char icmp_type; // 消息类型 unsigned char icmp_code; // 代码 unsigned short icmp_checksum; // 校验和 // 下面是回显头 unsigned short icmp_id; // 用来惟一标识此请求的ID号,通常设置为进程ID unsigned short icmp_sequence; // 序列号 unsigned long icmp_timestamp; // 时间戳 } ICMP_HDR, *PICMP_HDR; 完整代码及解析 #include ../common/initsock.h #include ../common/protoinfo.h #include ../common/comm.h #include stdio.h CInitSock theSock; typedef struct icmp_hdr { unsigned char icmp_type; // 消息类型 unsigned char icmp_code; // 代码 unsigned short icmp_checksum; // 校验和 // 下面是回显头 unsigned short icmp_id; // 用来惟一标识此请求的ID号,通常设置为进程ID unsigned short icmp_sequence; // 序列号 unsigned long icmp_timestamp; // 时间戳 } ICMP_HDR, *PICMP_HDR; int main() { // 目的IP地址,即要Ping的IP地址 char szDestIp[] = 192.168.1.104; // 127.0.0.1 // 创建原始套节字 SOCKET sRaw = ::socket

文档评论(0)

dajuhyy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档