⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pings.cpp

📁 通过RAW SOCKET可以时间延迟时间的计算
💻 CPP
字号:
#include <iostream.h>
#include <winsock2.h>
#include <windows.h>
#include <mstcpip.h>

#pragma link "ws2_32.lib"
typedef struct  iphdr
{
    unsigned char   h_lenver;
    unsigned char   tos;
    unsigned short  total_len;
    unsigned short  ident;
    unsigned short  frag_and_flags;
    unsigned char   ttl;
    unsigned char   proto;
    unsigned short  cksum;
    unsigned int    sourceip;
    unsigned int    destip;
} iphdr;

typedef struct  icmphdr
{
    unsigned char   i_type;
    unsigned char   i_code;
    unsigned short  i_cksum;
    unsigned short  i_id;
    unsigned short  i_seq;
} icmphdr;

int                 scanip, startip, stopip, socksend, stopthread;
struct sockaddr_in  sin;

/* */
unsigned short checksum(USHORT *buffer, int size)
{
    unsigned long   cksum=0;
    while(size > 0)
    {
        cksum+=*buffer++;
        size-=sizeof(USHORT);
    }

    if(size)
    {
        cksum+=*(UCHAR *)buffer;
    }

    cksum=(cksum >> 16) + (cksum & 0xffff);
    cksum+=(cksum >> 16);
    return(USHORT) (~cksum);
}

/* */
void start(void)
{
    cout << "\t\t-------------------------------------------\n";
    cout << "\t\t ||                                     || \n";
    cout << "\t\t ||            Ping    Sweep            || \n";
    cout << "\t\t ||                                     || \n";
    cout << "\t\t ||      Author:TOo2y    SafeChina      || \n";
    cout << "\t\t ||                                     || \n";
    cout << "\t\t-------------------------------------------\n";
    cout << endl;
}

/* */
void usage(void)
{
    cout << "Usage: Ping  < ip | startip  endip >" << endl;
}

/* */
void recv_packet(void *arg)
{
    int                 socksniffer;
    struct sockaddr_in  from;
    int                 packsize;
    char                buffer[1500]={ 0 };
    char                local[250]={ 0 };
    struct hostent      *hp;
    icmphdr             *icmpheader;
    iphdr               *ipheader;


    if((socksniffer=WSASocket(AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0, WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET)
    {
        cout << "WSASocket Error!" << endl;
        return;
    }

    memset(&sin, 0, sizeof(sin));
    gethostname(local, sizeof(local));
    hp=gethostbyname(local);
    sin.sin_addr=*(in_addr *)hp->h_addr_list[0];
    sin.sin_family=AF_INET;
    sin.sin_port=htons(11282);

    if(bind(socksniffer, (struct sockaddr *) &sin, sizeof(sin)) == SOCKET_ERROR)
    {
        cout << "Bind Error!" << endl;
        return;
    }

    icmpheader= (struct icmphdr *)(buffer + sizeof(iphdr));
    ipheader= (struct iphdr *)(buffer);

    while(!stopthread)
    {
        packsize=recv(socksniffer, buffer, sizeof(buffer), 0);
        if(packsize == SOCKET_ERROR || packsize < 0)
        {
            cout << "Receive Error: " << GetLastError() << endl;
            return;
        }

        if((icmpheader->i_id == GetCurrentProcessId()) && (ipheader->destip == sin.sin_addr.S_un.S_addr))
        {
            from.sin_addr.S_un.S_addr=ipheader->sourceip;
            cout << "[Host:] " << inet_ntoa(from.sin_addr) << "\t[Status:]  alive " << endl;
        }
    }
}

/* */
void send_packet(void)
{
    char                sendbuf[20];
    icmphdr             icmpheader;
    struct sockaddr_in  dest;

    icmpheader.i_cksum=0;
    icmpheader.i_code=0;
    icmpheader.i_type=8;
    icmpheader.i_seq=0;
    icmpheader.i_id=(USHORT) GetCurrentProcessId();
    icmpheader.i_cksum=checksum((USHORT *) &icmpheader, sizeof(icmpheader));
    memset(sendbuf, 0, sizeof(sendbuf));
    memcpy(sendbuf, &icmpheader, sizeof(icmpheader));
    dest.sin_addr.S_un.S_addr=htonl(scanip);
    dest.sin_family=AF_INET;
    sendto(socksend, sendbuf, sizeof(sendbuf), 0, (struct sockaddr *) &dest, sizeof(dest));
}

/* */
int main(int argc, char *argv[])
{
    WSADATA             wsa;
    HANDLE              hThread;

    start();
    if(argc != 3)
    {
        usage();
        return -1;
    }

    startip=ntohl(inet_addr(argv[1]));
    stopip=ntohl(inet_addr(argv[2]));
    stopthread=0;

    WSAStartup(MAKEWORD(2, 2), &wsa);
    socksend=WSASocket(AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0, WSA_FLAG_OVERLAPPED);
    cout << "Waiting..." << endl;
    hThread=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) recv_packet, NULL, 0, NULL);
    Sleep(2000);
    for(scanip=startip; scanip <= stopip; scanip++)
    {
        send_packet();
        Sleep(10);
    }

    Sleep(10000);
    stopthread=1;
    if(WaitForSingleObject(hThread, 1000) == WAIT_TIMEOUT)
    {
        TerminateThread(hThread, 0);
    }
    CloseHandle(hThread);
    WSACleanup();
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -