首页 > 学院 > 开发设计 > 正文

Z5NTS功能之icmp

2019-11-17 04:36:19
字体:
来源:转载
供稿:网友
Author:zfive5(zhaozidong)Email :zfive5@yahoo.com.cn连续两天,终于完成了Z5NTS imcp部分-可以发送所有imcp类型数据,对icmp协议也有了近一步的熟悉,IMCP类型说明如下(主要是参见stevens的TCP/ip三卷,这几本读三遍也不为过):Z5NTS功能之icmp(图一)
点击查看大图
 类型 代码  描述0     0    回显应答3          目的不可达0    网络不可达
1    主机不可达2    协议不可达3    端口不可达4    需要进行分片但设置了不分片比特5    源站选路失败6    目的网络不熟悉7    目的主机不熟悉8    源主机被隔离(作废不用)9    目的网络被强制禁止
10   目的主机被强制禁止11   由于服务类型TOS网络不可达12   由于服务类型TOS主机不可达13   由于过滤,通信被强制禁止14   主机越权15   优先权中止生效4     0    源端被关闭5          重定向
0    对网络重定向1    对主机重定向2    对服务类型和网络重定向3    对服务类型和主机重定向8     0    请求回显(Ping请求)9     0    路由器通告10    0    路由器请求11         超时0    传输期间生存时间为0
1    在数据报组装期间生存时间为012         参数问题0    坏的IP首部(包括各种差错)1    缺少必需的选项13    0    时间戳请求14    0    时间戳应答15    0    信息请求(作废不用)16    0    信息应答(作废不用)17    0    地址掩码请求
18    0    地址掩码应答功能界面如下: Z5NTS功能之icmp(图二) 功能介绍:根据所选类型生成对应的格式图样,然后用户在参照对应的格式图样形成对应的协议数据,例如回送请求类型的十六进制数据如下:类 型:08代 码:00校验和:00,00,(这里需要使用CheckSum函数来计算)标识符:01,02序 号:02,01数 据:00,00,00,00
核心代码如下:typedef strUCt ICMPHeader {       UCHAR   icmp_type;      // icmp type       UCHAR   icmp_code;      // icmp code       USHORT  icmp_checksum;  // icmp checksum    unsigned char    szBUF[1];} ICMPHDR; int Open(){       hSock=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);       if(hSock==INVALID_SOCKET)       {              return -1;       }
       int iTimeOut=15000;       setsockopt(hSock,SOL_SOCKET,SO_RCVTIMEO,(char *)&iTimeOut,sizeof(iTimeOut));       return 0;}int Close(){       if(hSock!=INVALID_SOCKET)              closesocket(hSock);       hSock=NULL;       return 0;}int IcmpSend(char *szAddr,char *szInBUF,int iInLen,int iType){       struct hostent *phs;       struct sockaddr_in in;
       in.sin_family =AF_INET;       in.sin_port=htons(0);       in.sin_addr.S_un.S_addr =inet_addr(szAddr);       if(in.sin_addr.S_un.S_addr==INADDR_NONE)       {              phs=gethostbyname(szAddr);              in.sin_addr.s_addr=*((u_long *)&(phs->h_addr_list[0]));       }       if(iType==0)       {          ICMPHDR *pICMPHDR=(ICMPHDR *)(szInBUF);          pICMPHDR->icmp_checksum=0;          pICMPHDR->icmp_checksum=CheckSum((unsigned short *)szInBUF,iInLen);       }
    int iRet;       iRet=sendto(hSock,szInBUF,iInLen,0,(struct sockaddr *)&in,sizeof(struct sockaddr_in));       if(iRet==SOCKET_ERROR)       {              return -1;       }              if(iRet!=iInLen)       {              return -2;       }       return 0;}unsigned short CheckSum(unsigned short *szBUF,int iSize){       unsigned long ckSum=0;    for(;iSize>1;iSize-=sizeof(unsigned short))
       {              ckSum+=*szBUF++;       }       if(iSize==1)       {              ckSum+=*(unsigned char *)szBUF;       }       ckSum=(ckSum>>16)+(ckSum&0xffff);       ckSum+=(ckSum>>16);       return(unsigned short )(~ckSum);}

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表