zoukankan      html  css  js  c++  java
  • icmpscanning.cpp

    // icmpscanning.cpp : 定义控制台应用程序的入口点。
    //

    #include "stdafx.h"
    #include "winsock2.h"
    #pragma comment(lib,"ws2_32.lib")
    typedef struct lpHeader
    {
    unsigned char Version_HLen;//首部长度 ,ip 版本号
    unsigned char TOS; //服务类型tos
    unsigned short Length;//总长度
    unsigned short Ident;//标示
    unsigned short Flags_Offset;//标志位
    unsigned char TTL; //生存时间 ttl
    unsigned char Protocol;//协议类型
    unsigned short Checksum;//ip首部校验和
    unsigned int SourceAddr;//源ip地址
    unsigned int DestinationAddr;//目的ip地址
    }Ip_Header;
    typedef struct IcmpHeader
    {
    BYTE Type;//8位类型
    BYTE Code;//8位代码
    USHORT Checksum;//16位校验和
    USHORT ID;//16位识别号
    USHORT Sequence;//16喂 报文序列号
    }Icmp_Header;
    //计算机校验和
    USHORT checksum(USHORT *buff,int size)
    {
    unsigned long cksum=0;
    while(size>1)
    {
    cksum+=*buff++;
    size-=sizeof(USHORT);
    }
    if(size){
    cksum+=*(UCHAR*)(buff);
    }
    cksum=(cksum>>16)+(cksum&0xffff);
    cksum+=(cksum>>16);
    return (USHORT)(~cksum);
    }
    //主函数
    int _tmain(int argc, _TCHAR* argv[])
    {
    WSADATA wsaData;
    sockaddr_in DestAddr;
    Ip_Header *ip;
    Icmp_Header *icmp;
    //发送icmp的数据
    Icmp_Header *SendIcmp;
    //设置超时
    int Timeout=1000;
    char DestIpAddr[100]="127.0.0.1";
    //icmp的内容
    char IcmpBuffer[8]="";
    SOCKET IcmpSocket;
    char RecvBuffer[1024];
    sockaddr_in addr;
    int Len=sizeof(addr);
    int Result;
    WSAStartup(MAKEWORD(2,2),&wsaData);
    IcmpSocket=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);
    setsockopt(IcmpSocket,SOL_SOCKET,SO_RCVTIMEO,(char*)&Timeout,sizeof(Timeout));
    memset(&DestAddr,0,sizeof(DestAddr));
    DestAddr.sin_addr.s_addr=inet_addr(DestIpAddr);
    DestAddr.sin_port=htons(0);
    DestAddr.sin_family=AF_INET;
    //填充icmp数据内容
    SendIcmp=(Icmp_Header*)IcmpBuffer;
    SendIcmp->Type=8;
    SendIcmp->Code=0;
    SendIcmp->ID=(USHORT)GetCurrentProcessId();
    SendIcmp->Sequence=htons(1);
    SendIcmp->Checksum=0;
    SendIcmp->Checksum=checksum((USHORT*)IcmpBuffer,sizeof(IcmpBuffer));
    //发送
    sendto(IcmpSocket,IcmpBuffer,sizeof(IcmpBuffer),0,(SOCKADDR*)&DestAddr,sizeof(DestAddr));
    recvfrom(IcmpSocket,RecvBuffer,1024,0,(sockaddr*)&addr,&Len);
    ip=(Ip_Header*)RecvBuffer;
    if((ip->SourceAddr==inet_addr(DestIpAddr))&&(ip->Protocol==IPPROTO_ICMP))
    {
    icmp=(Icmp_Header*)(RecvBuffer+sizeof(Ip_Header));
    if(icmp->Type!=0)
    {
    printf("type error %d",icmp->Type);
    return 0;

    }
    if(icmp->ID!=GetCurrentProcessId())
    {
    printf("id error %d\n",icmp->ID);
    return 0;
    }
    else if((icmp->Type==0)&&(icmp->ID==GetCurrentProcessId())){
    printf("Host%s is up\n",DestIpAddr);

    }

    }
    closesocket(IcmpSocket);
    WSACleanup();
    getchar();

    return 0;
    }

  • 相关阅读:
    JAVA正则表达式:Pattern类与Matcher类详解(转)
    java基础知识拾遗(四)
    java.sql.Types,数据库字段类型,java数据类型的对应关系
    根据字节码探讨java自增运算符的原理
    JAVA的abstract修饰符 && 接口interface用法 && 抽象类和interface的差别
    JAVA线程间的状态转换
    java基础知识拾遗(三)
    java布尔值进行and和or逻辑运算原理
    java字节码指令集
    shell实现SSH自动登陆【转】
  • 原文地址:https://www.cnblogs.com/herizai/p/3094812.html
Copyright © 2011-2022 走看看