




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上基于ICMP的主机存活性探测原理与实现1. 工作原理 ICMP是“InternetControlMessageProtocol"(Internet控制消息协议)的缩写它是TCP/IP协议族的一个子协议,用于在IP主机路由器之间传递控制消息控制消息是指网络通不通主机是否可达路由是否可用等网络本身的消息这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用2.程序设计(1)设计要求 通过这次设计,要求了解TCP/IP的基本协议的工作原理和基本的网络编程知识,利用单(多)线程技术、API函数等编写服务和客户端应用程序,利用MFC提供的类编写较为复杂
2、网络应用程序。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。 (2) 主要代码 /定义ICMP结构体。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
3、 long icmp_timestamp; / 时间戳 ICMP_HDR, *PICMP_HDR;typedef struct _iphdr unsigned int h_len:4; /头长度 unsigned int version:4;/IP版本 unsigned char tos; /服务类型 unsigned short total_len;/包的总长度 unsigned short ident; /包标识身份 unsigned short frag_and_flags;/标志 unsigned char ttl; /包生命周期 unsigned char proto; /协议类型
4、unsigned short checksum; /IP校验 unsigned int sourceIP; /源IP unsigned int destIP; /目标IP IPHeader; /设置最长存活期 BOOL CICMPDlg:SetTTL(SOCKET s, int nValue) int ret = setsockopt(s, IPPROTO_IP, IP_TTL, (char*)&nValue, sizeof(nVa
5、lue); return ret != SOCKET_ERROR;/设置超时时间BOOL CICMPDlg:SetTimeout(SOCKET s, int nTime, BOOL bRecv) int ret = setsockopt(s, SOL_SOCKET, bR
6、ecv ? SO_RCVTIMEO : SO_SNDTIMEO, (char*)&nTime, sizeof(nTime); return ret != SOCKET_ERROR;/检查校验和USHORT CICMPDlg:checksum(USHORT* buff, int size) unsigned long cksum =
7、0;0; while(size>1) cksum += *buff+; size -= sizeof(USHORT); / 是奇数 &
8、#160;if(size) cksum += *(UCHAR*)buff; / 将32位的chsum高16位和低16位相加,然后取反 cksum = (cksum >> 16) + (cksum &
9、 0xffff); cksum += (cksum >> 16); return (USHORT)(cksum); UpdateData(true);int count=m_list.GetItemCount();char szDestIp = &qu
10、ot;10.0.0.2" / 127.0.0.1WSADATA WSAData;if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)MessageBox("WSAStartup初始化失败。");return;/发送一个ICMP包,接受到返回的包之后开始解析。 / 创建原始套节字 SOCKET sRaw = socket(AF_INE
11、T, SOCK_RAW, IPPROTO_ICMP); / 设置接收超时 SetTimeout(sRaw, 1000, TRUE);int IpAddress;IpAddress=inet_addr(m_Address);/IpAddress=inet_addr("10.0.0.2");if(IpAddress=INADDR_NONE)MessageBox("IP地址错误!");hostent*
12、;pHostent=gethostbyname(m_Address);if(pHostent)IpAddress=(*(in_addr *)pHostent->h_addr).s_addr; / 设置目的地址SOCKADDR_IN dest;memset(&dest,0,sizeof(dest); dest.sin_family = AF_INET; dest.sin_port =
13、160;htons(0); dest.sin_addr.S_un.S_addr =IpAddress; / 创建ICMP封包 char buffsizeof(ICMP_HDR) + 32;memset(buff,0,sizeof(buff);memset(&buffsizeof(ICMP_HDR), 'E', 32);/USHORT
14、; nSeq = 0; char recvBuf1024; SOCKADDR_IN from; int nLen = sizeof(from); int nRet; ICMP_HDR* pIcmp = (ICMP_HDR*)buff;
15、160;pIcmp->icmp_type = 8; / 请求一个ICMP回显 pIcmp->icmp_code = 0; pIcmp->icmp_id = (USHORT)GetCurrentProcessId(); pIcmp->icmp_timestamp = GetTickCount();
16、60; pIcmp->icmp_sequence =1; pIcmp->icmp_checksum = checksum(USHORT*)buff, sizeof(ICMP_HDR) + 32); nRet = sendto(sRaw, buff, sizeof(ICMP_HDR) + 32,
17、 0, (SOCKADDR *)&dest, sizeof(dest); if(nRet = SOCKET_ERROR) MessageBox("发送错误!"); return;
18、160; nRet = recvfrom(sRaw, recvBuf, 1024, 0, (sockaddr*)&from, &nLen); if(nRet = SOCKET_ERROR) if(WSAGetLastError() =
19、160;WSAETIMEDOUT) m_list.InsertItem(count,m_Address); m_list.SetItemText(count,1,"关闭"); return;
20、 return; / 下面开始解析接收到的ICMP封包 if(nRet < sizeof(IPHeader) + sizeof(ICMP_HDR) m_list.InsertItem(count,m_Address);m_list.SetItemText(count,1,"关闭");return; / 接收到的数据中包含IP头,IP头大小为20个字节,所以加20得到ICMP头 ICMP_HDR* pRecvIcmp = (ICMP_HDR*)(recvBuf + 20); / (ICMP_HD
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年沈阳大车货运资格证考试题
- 2025年贵阳货运从业资格证考试模拟试题及答案大全解析
- 单位绿化树木修剪合同范本
- 上水泥合同范本
- 冷库设备租用合同范本
- 企业收款合同范本
- 协议客户合同范本
- 公路项目总承包合同范本
- 制作样册合同范例
- 医院食堂购销合同范本
- 2024年南京旅游职业学院高职单招语文历年参考题库含答案解析
- 《电商直播》 课件 项目一 走入电商直播
- 《中国宫腔镜诊断与手术临床实践指南(2023版)》解读课件
- 中药学电子版教材
- GB/T 9535-1998地面用晶体硅光伏组件设计鉴定和定型
- 知乎的SWOT分析(表格)
- 常用家电维修基础知识(课堂PPT)
- 杨氏太极拳37式拳谱
- 卧式设备安装
- 桥梁施工危险源辨识与防控措施
- CFG桩施工记录表范本
评论
0/150
提交评论