• 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;
    }

  • 相关阅读:
    关于VS下的应用程序出现0xc000007b的问题以及OpenCV相关的0xc000007b问题
    彻底解决DZ大附件上传问题
    基于Red5的视频直播平台
    .htaccess重写URL讲解
    了解Linux实时内核
    Linux操作系统实时性分析
    5分钟教程:如何通过UART获得root权限
    记一次有惊无险的Linux数据恢复过程
    11款最棒的Linux数据恢复工具
    Xamarin.Android开发实践(六)
  • 原文地址:https://www.cnblogs.com/herizai/p/3094812.html
Copyright © 2020-2023  润新知