资源预览内容
第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
亲,该文档总共7页全部预览完了,如果喜欢就下载吧!
资源描述
基于ICMP的主机存活性探测原理与实现1. 工作原理 ICMP是“InternetControlMessageProtocol(Internet控制消息协议)的缩写它是TCP/IP协议族的一个子协议,用于在IP主机路由器之间传递控制消息控制消息是指网络通不通主机是否可达路由是否可用等网络本身的消息这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用2.程序设计(1)设计要求 通过这次设计,要求了解TCP/IP的基本协议的工作原理和基本的网络编程知识,利用单(多)线程技术、API函数等编写服务和客户端应用程序,利用MFC提供的类编写较为复杂网络应用程序。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。 (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 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; /协议类型 unsigned short checksum; /IP校验 unsigned int sourceIP; /源IP unsigned int destIP; /目标IP IPHeader; /设置最长存活期 BOOLCICMPDlg:SetTTL(SOCKETs,intnValue)intret=setsockopt(s,IPPROTO_IP,IP_TTL,(char*)&nValue,sizeof(nValue);returnret!=SOCKET_ERROR;/设置超时时间BOOLCICMPDlg:SetTimeout(SOCKETs,intnTime,BOOLbRecv)intret=setsockopt(s,SOL_SOCKET,bRecv?SO_RCVTIMEO:SO_SNDTIMEO,(char*)&nTime,sizeof(nTime);returnret!=SOCKET_ERROR;/检查校验和USHORTCICMPDlg:checksum(USHORT*buff,intsize)unsignedlongcksum=0;while(size1)cksum+=*buff+;size-=sizeof(USHORT);/是奇数if(size)cksum+=*(UCHAR*)buff;/将32位的chsum高16位和低16位相加,然后取反cksum=(cksum16)+(cksum&0xffff);cksum+=(cksum16);return(USHORT)(cksum); UpdateData(true);intcount=m_list.GetItemCount();charszDestIp=10.0.0.2;/127.0.0.1WSADATAWSAData;if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)MessageBox(WSAStartup初始化失败。);return;/发送一个ICMP包,接受到返回的包之后开始解析。/创建原始套节字SOCKETsRaw=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);/设置接收超时SetTimeout(sRaw,1000,TRUE);intIpAddress;IpAddress=inet_addr(m_Address);/IpAddress=inet_addr(10.0.0.2);if(IpAddress=INADDR_NONE)MessageBox(IP地址错误!);hostent*pHostent=gethostbyname(m_Address);if(pHostent)IpAddress=(*(in_addr*)pHostent-h_addr).s_addr;/设置目的地址SOCKADDR_INdest;memset(&dest,0,sizeof(dest);dest.sin_family=AF_INET;dest.sin_port=htons(0);dest.sin_addr.S_un.S_addr=IpAddress;/创建ICMP封包charbuffsizeof(ICMP_HDR)+32;memset(buff,0,sizeof(buff);memset(&buffsizeof(ICMP_HDR),E,32);/USHORTnSeq=0;charrecvBuf1024;SOCKADDR_INfrom;intnLen=sizeof(from);intnRet;ICMP_HDR*pIcmp=(ICMP_HDR*)buff;pIcmp-icmp_type=8;/请求一个ICMP回显pIcmp-icmp_code=0;pIcmp-icmp_id=(USHORT)GetCurrentProcessId();pIcmp-icmp_timestamp=GetTickCount();pIcmp-icmp_sequence=1;pIcmp-icmp_checksum=checksum(USHORT*)buff,sizeof(ICMP_HDR)+32);nRet=sendto(sRaw,buff,sizeof(ICMP_HDR)+32,0,(SOCKADDR*)&dest,sizeof(dest);if(nRet=SOCKET_ERROR)MessageBox(发送错误!);return;nRet=recvfrom(sRaw,recvBuf,1024,0,(sockaddr*)&from,&nLen);if(nRet=SOCKET_ERROR)if(WSAGetLastError()=WSAETIMEDOUT)m_list.InsertItem(count,m_Address);m_list.SetItemText(count,1,关闭);return;return;/下面开始解析接收到的ICMP封包if(nReticmp_type!=0)/回显 m_list.InsertItem(count,m_Address);m_list.SetItemText(count,1,关闭);return;if(pRecvIcmp-icmp_id!=GetCurrentProcessId()m_list.InsertItem(count,m_Address);m_list.SetItemText(count,1,关闭);return;m_list.InsertItem(count,m_Address);m_list.SetItemText(count,1,打开);(3) 程序测试(程序运行结果) 我的电脑操作系统为win10. 开启defender之后,编写的程序发送不出去ICMP包。换一操作系统应该可以。后检测到是防火墙未关闭,报文没有发送出去。
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号