【云计算 IT 基础知识】5.3.5 ICMP

muzilan 2016-06-23 10:19:35
概念
Internet控制报文协议ICMP(Internet Control Message Protocol)是一种面向无连接的协议(在RFC792文档中定义),是TCP/IP协议族的一个子协议,使用IP做为底层支持。用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。因此ICMP是一个非常重要的协议,对于网络安全具有极其重要的意义。

ICMP的功能主要有:
l 主机选择
l 路由维护
l 路由选择
l 流量控制

分类
ICMP报文一般可分为:
l ICMP差错报文:用于报告处理数据报过程中的错误,如目的不可达、超时等。ICMP差错报文会返回给发送源数据的设备。发送源数据的设备随后可根据ICMP差错报文确定发生错误的类型,并确定如何才能更好地重发失败的数据包。
ICMP的功能仅是报告问题,由发送方完成纠正错误的任务。

l ICMP查询报文:用于查询网络中的基本信息,如回显、时间戳、地址掩码等。源设备向目的设备发送ICMP查询报文。目的设备将ICMP差错报文或携带查询结果的ICMP查询报文返回给源设备。源设备可根据返回的报文获知网络信息,并进行可能的、相应的处理。

每类ICMP报文又可细分为多种类型,不同类型由报文中的类型字段和代码字段来共同决定。详细分类请参见RFC792。

报文格式
ICMP报文使用IP首部,并封装在IP数据报内部进行传输,如图5-16所示。


IP首部中的协议类型字段为1时表明其IP数据是ICMP报文。ICMP报文的格式如图5-17所示。所有报文的前4个字节都是一样的,剩下的其他字节则互不相同。


ICMP报文中各字段的含义如表5-7所示。

...全文
1226 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
muzilan 2016-09-30
  • 打赏
  • 举报
回复
引用 17 楼 design_1314 的回复:
来学习的,感谢整理
同学习
引用 18 楼 lanlandemiaomiao 的回复:
一起加油学习下去
muzilan 2016-09-30
  • 打赏
  • 举报
回复
引用 17 楼 design_1314 的回复:
来学习的,感谢整理
同学习
莉莉丝O-O 2016-09-29
  • 打赏
  • 举报
回复
design_1314 2016-09-27
  • 打赏
  • 举报
回复
来学习的,感谢整理
赵4老师 2016-08-08
  • 打赏
  • 举报
回复
仅供参考:
#include <windows.h>
#include <stdio.h>
#include <string.h>
char YN(int k) {
    FILE *f;
    char fn[40];
    char ln[80];
    char yn;
    int n;

    yn='N';
    sprintf(fn,"d:\\ping%d.txt",k);
    f=fopen(fn,"r");
    if (NULL!=f) {
        n=0;
        while (1) {
            if (NULL==fgets(ln,80,f)) break;//
            if (strstr(ln,"ms ")) {
                yn='Y';
                break;//
            }
            n++;
            if (n>=4) break;//
        }
        fclose(f);
    }
    return yn;
}
void main(int argc,char **argv) {
    char cmdstr[256];
    int i;
    int IP[3];
    char c;

    if (argc<2) {
    USAGE:
        printf("Usage example:\n    %s 192.168.60.\nto test 192.168.60.1-254\n",argv[0]);
        return;
    }
    if (4==sscanf(argv[1],"%d.%d.%d%c",&IP[0],&IP[1],&IP[2],&c)) {
        if (0<=IP[0] && IP[0]<=255
         && 0<=IP[1] && IP[1]<=255
         && 0<=IP[2] && IP[2]<=255
         && '.'==c) {
            for (i=1;i<255;i++) {
                sprintf(cmdstr,"cmd /c ping %s%d -n 1 -w 1000 >d:\\ping%d.txt",argv[1],i,i);
                WinExec(cmdstr,SW_HIDE);
            }
            Sleep(3000);
            for (i=1;i<255;i++) {
                printf("%c %s%d\n",YN(i),argv[1],i);
            }
            Sleep(3000);
            WinExec("cmd /c del /q d:\\ping*.txt",SW_HIDE);
        } else goto USAGE;
    } else goto USAGE;
}
muzilan 2016-08-07
  • 打赏
  • 举报
回复
引用 14 楼 chenlycly 的回复:
引用 5 楼 zhao4zhong1 的回复:
提醒:Win7以上似乎对SOCK_RAW做了限制。
win7下创建Raw裸套接字需要管理员权限,对于没有以管理员权限运行的程序,则会创建失败!
dvlinker 2016-08-07
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
提醒:Win7以上似乎对SOCK_RAW做了限制。
win7下创建Raw裸套接字需要管理员权限,对于没有以管理员权限运行的程序,则会创建失败!
muzilan 2016-06-28
  • 打赏
  • 举报
回复
引用 9 楼 line_us 的回复:
是一个非常重要的协议,对于网络安全具有极其重要的意义。
恩恩
muzilan 2016-06-28
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
仅供参考:
#include <windows.h>
#include <stdio.h>
#include <string.h>
char YN(int k) {
    FILE *f;
    char fn[40];
    char ln[80];
    char yn;
    int n;

    yn='N';
    sprintf(fn,"d:\\ping%d.txt",k);
    f=fopen(fn,"r");
    if (NULL!=f) {
        n=0;
        while (1) {
            if (NULL==fgets(ln,80,f)) break;//
            if (strstr(ln,"ms ")) {
                yn='Y';
                break;//
            }
            n++;
            if (n>=4) break;//
        }
        fclose(f);
    }
    return yn;
}
void main(int argc,char **argv) {
    char cmdstr[256];
    int i;
    int IP[3];
    char c;

    if (argc<2) {
    USAGE:
        printf("Usage example:\n    %s 192.168.60.\nto test 192.168.60.1-254\n",argv[0]);
        return;
    }
    if (4==sscanf(argv[1],"%d.%d.%d%c",&IP[0],&IP[1],&IP[2],&c)) {
        if (0<=IP[0] && IP[0]<=255
         && 0<=IP[1] && IP[1]<=255
         && 0<=IP[2] && IP[2]<=255
         && '.'==c) {
            for (i=1;i<255;i++) {
                sprintf(cmdstr,"cmd /c ping %s%d -n 1 -w 1000 >d:\\ping%d.txt",argv[1],i,i);
                WinExec(cmdstr,SW_HIDE);
            }
            Sleep(3000);
            for (i=1;i<255;i++) {
                printf("%c %s%d\n",YN(i),argv[1],i);
            }
            Sleep(3000);
            WinExec("cmd /c del /q d:\\ping*.txt",SW_HIDE);
        } else goto USAGE;
    } else goto USAGE;
}
感谢补充
引用 4 楼 zhao4zhong1 的回复:
再供参考:
#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>
#include <mmsystem.h>
#pragma comment(lib, "ws2_32")
#pragma comment(lib, "winmm")
#define ICMP_ECHOREPLY 0 //ICMP回应答复
#define ICMP_ECHOREQ 8 //ICMP回应请求
#define REQ_DATASIZE 32 //请求数据报大小
#include <iostream>
using namespace std;

//定义IP首部格式
typedef struct _IPHeader {
    u_char VIHL; //版本和首部长度
    u_char ToS; //服务类型
    u_short TotalLen; //总长度
    u_short ID; //标识号
    u_short Frag_Flags; //片偏移量
    u_char TTL; //生存时间
    u_char Protocol; //协议
    u_short Checksum; //首部校验和
    struct in_addr SrcIP; //源IP地址
    struct in_addr DestIP; //目的地址
}
IPHDR, *PIPHDR;

//定义ICMP首部格式
typedef struct _ICMPHeader {
    u_char Type; //类型
    u_char Code; //代码
    u_short Checksum; //首部校验和
    u_short ID; //标识
    u_short Seq; //序列号
    char Data; //数据
}
ICMPHDR, *PICMPHDR;

//定义ICMP回应请求
typedef struct _ECHOREQUEST {
    ICMPHDR icmpHdr;
    DWORD dwTime;
    char cData[REQ_DATASIZE];
}
ECHOREQUEST, *PECHOREQUEST;

//定义ICMP回应答复
typedef struct _ECHOREPLY {
    IPHDR ipHdr;
    ECHOREQUEST echoRequest;
    char cFiller[256];
}
ECHOREPLY, *PECHOREPLY;

//计算校验和
u_short checksum(u_short *buffer, int len) {
    register int nleft = len;
    register u_short *w = buffer;
    register u_short answer;
    register int sum = 0;
    //使用32位累加器,进行16位的反馈计算
    while ( nleft > 1 ) {
        sum += *w++;
        nleft -= 2;
    }
    //补全奇数位
    if ( nleft == 1 ) {
        u_short u = 0;
        *(u_char *)(&u) = *(u_char*)w;
        sum += u;
    }
    //将反馈的16位从高位移到低位
    sum = (sum >> 16) + (sum & 0xffff);
    sum += (sum >> 16);
    answer = ~sum;
    return (answer);
}

//发送回应请求函数
int SendEchoRequest(SOCKET s, struct sockaddr_in *lpstToAddr) {
    static ECHOREQUEST echoReq;
    static int nId = 1;
    static int nSeq = 1;
    int nRet;
    //填充回应请求消息
    echoReq.icmpHdr.Type = ICMP_ECHOREQ;
    echoReq.icmpHdr.Code = 0;
    echoReq.icmpHdr.Checksum = 0;
    echoReq.icmpHdr.ID = nId++;
    echoReq.icmpHdr.Seq = nSeq++;
    //填充要发送的数据
    for (nRet = 0; nRet < REQ_DATASIZE; nRet++) {
        echoReq.cData[nRet] = '1' + nRet;
    }
    //存储发送的时间
    echoReq.dwTime = timeGetTime();
    //计算回应请求的校验和
    echoReq.icmpHdr.Checksum = checksum((u_short*)&echoReq, sizeof(ECHOREQUEST));
    //发送回应请求
    nRet = sendto(s,(LPSTR)&echoReq,sizeof(ECHOREQUEST),
                  0,(struct sockaddr*)lpstToAddr,sizeof(SOCKADDR_IN));
    if (nRet == SOCKET_ERROR) {
        printf("send to() error:%d\n", WSAGetLastError());
    }
    return (nRet);
}

//接收应答回复并进行解析
DWORD RecvEchoReply(SOCKET s, LPSOCKADDR_IN lpsaFrom, u_char *pTTL) {
    ECHOREPLY echoReply;
    int nRet;
    int nAddrLen = sizeof(struct sockaddr_in);
    //接收应答回复
    nRet = recvfrom(s,(LPSTR)&echoReply,sizeof(ECHOREPLY),
                    0,(LPSOCKADDR)lpsaFrom,&nAddrLen);
    //检验接收结果

    if (nRet == SOCKET_ERROR) {
        printf("recvfrom() error:%d\n",WSAGetLastError());
    }
    //记录返回的TTL
    *pTTL = echoReply.ipHdr.TTL;
    //返回应答时间
    return(echoReply.echoRequest.dwTime);
}

//等待回应答复,使用select模型
int WaitForEchoReply(SOCKET s) {
    struct timeval timeout;
    fd_set readfds;
    readfds.fd_count = 1;
    readfds.fd_array[0] = s;
    timeout.tv_sec = 1;
    timeout.tv_usec = 0;
    return(select(1, &readfds, NULL, NULL, &timeout));
}

//PING功能实现
void Ping(char *pstrHost,bool logic) {
    SOCKET rawSocket;
    LPHOSTENT lpHost;
    struct sockaddr_in destIP;
    struct sockaddr_in srcIP;
    DWORD dwTimeSent;
    DWORD dwElapsed;
    u_char cTTL;
    int nLoop,k=4;
    int nRet,minimum=100000,maximum=0,average=0;
    int sent=4,reveived=0,lost=0;
    //创建原始套接字,ICMP类型
    rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
    if (rawSocket == SOCKET_ERROR) {
        printf("socket() error:%d\n", WSAGetLastError());
        return;
    }
    //检测目标主机
    lpHost = gethostbyname(pstrHost);
    if (lpHost==NULL) {
        printf("Host not found:%s\n", pstrHost);
        return;
    }
    //设置目标机地址
    destIP.sin_addr.s_addr = *((u_long FAR*)(lpHost->h_addr)); //设置目标IP
    destIP.sin_family = AF_INET;  //地址规格
    destIP.sin_port = 0;
    //提示开始进行PING
    printf("\nPinging %s [%s] with %d bytes of data:\n",pstrHost,inet_ntoa(destIP.sin_addr),REQ_DATASIZE);
    //发起多次PING测试
    for (nLoop=0; nLoop<k; nLoop++) {
        if (logic)k=k+1;
        //发送ICMP回应请求
        SendEchoRequest(rawSocket, &destIP);
        //等待回复的数据
        nRet = WaitForEchoReply(rawSocket);
        if (nRet == SOCKET_ERROR) {
            printf("select() error:%d\n", WSAGetLastError());
            break;
        }
        if (!nRet) {
            lost++;
            printf("\nRequest time out.");
            continue;
        }
        //接收回复
        dwTimeSent = RecvEchoReply(rawSocket, &srcIP, &cTTL);
        reveived++;
        //计算花费的时间
        dwElapsed = timeGetTime() - dwTimeSent;
        if(dwElapsed>maximum)maximum=dwElapsed;
        if(dwElapsed<minimum)minimum=dwElapsed;
        average+=dwElapsed;
        printf("\nReply from %s: bytes = %d time = %ldms TTL = %d",
               inet_ntoa(srcIP.sin_addr),REQ_DATASIZE,dwElapsed,cTTL);
    }
    printf("\n\n");
    printf("Ping statistics for %s:\n",inet_ntoa(srcIP.sin_addr));
    printf("    Packets: Sent = %d, Received = %d, Lost = %d (%.f%% loss),\n",
           sent,reveived,lost,(float)(lost*1.0/sent)*100);
    if(lost==0) {
        printf("Approximate round trip times in milli-seconds:\n");
        printf("    Minimum = %dms, Maximum = %dms, Average = %dms\n",minimum,maximum,average/sent);
    }
    printf("\n\n");
    nRet = closesocket(rawSocket);
    if (nRet == SOCKET_ERROR) {
        printf("closesocket() error:%d\n", WSAGetLastError());
    }
}

void main() {
    printf("Welcome to the Ping Test\n");
    while(1) {
        WSADATA wsd;//检测输入的参数
        //初始化Winsock
        if (WSAStartup(MAKEWORD(1, 1), &wsd) != 0) {
            printf("加载 Winsock 失败!\n");
        }
        char opt1[100];
        char *ptr=opt1;
        bool log=false;
        printf("Ping ");
        cin.getline(opt1,100,'\n');
        if ((opt1[0]=='-')&&(opt1[1]=='t')&&(opt1[2]==' ')) {
            log=true;
            ptr=opt1+3;
        }
        //开始PING
        Ping(ptr,log);
        //程序释放 Winsock 资源
        WSACleanup();
    }
}
再谢补充
dwa4821 2016-06-27
  • 打赏
  • 举报
回复
111111111111111111111111
line_us 2016-06-24
  • 打赏
  • 举报
回复
是一个非常重要的协议,对于网络安全具有极其重要的意义。
赵4老师 2016-06-24
  • 打赏
  • 举报
回复
提醒:Win7以上似乎对SOCK_RAW做了限制。
赵4老师 2016-06-24
  • 打赏
  • 举报
回复
再供参考:
#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>
#include <mmsystem.h>
#pragma comment(lib, "ws2_32")
#pragma comment(lib, "winmm")
#define ICMP_ECHOREPLY 0 //ICMP回应答复
#define ICMP_ECHOREQ 8 //ICMP回应请求
#define REQ_DATASIZE 32 //请求数据报大小
#include <iostream>
using namespace std;

//定义IP首部格式
typedef struct _IPHeader {
    u_char VIHL; //版本和首部长度
    u_char ToS; //服务类型
    u_short TotalLen; //总长度
    u_short ID; //标识号
    u_short Frag_Flags; //片偏移量
    u_char TTL; //生存时间
    u_char Protocol; //协议
    u_short Checksum; //首部校验和
    struct in_addr SrcIP; //源IP地址
    struct in_addr DestIP; //目的地址
}
IPHDR, *PIPHDR;

//定义ICMP首部格式
typedef struct _ICMPHeader {
    u_char Type; //类型
    u_char Code; //代码
    u_short Checksum; //首部校验和
    u_short ID; //标识
    u_short Seq; //序列号
    char Data; //数据
}
ICMPHDR, *PICMPHDR;

//定义ICMP回应请求
typedef struct _ECHOREQUEST {
    ICMPHDR icmpHdr;
    DWORD dwTime;
    char cData[REQ_DATASIZE];
}
ECHOREQUEST, *PECHOREQUEST;

//定义ICMP回应答复
typedef struct _ECHOREPLY {
    IPHDR ipHdr;
    ECHOREQUEST echoRequest;
    char cFiller[256];
}
ECHOREPLY, *PECHOREPLY;

//计算校验和
u_short checksum(u_short *buffer, int len) {
    register int nleft = len;
    register u_short *w = buffer;
    register u_short answer;
    register int sum = 0;
    //使用32位累加器,进行16位的反馈计算
    while ( nleft > 1 ) {
        sum += *w++;
        nleft -= 2;
    }
    //补全奇数位
    if ( nleft == 1 ) {
        u_short u = 0;
        *(u_char *)(&u) = *(u_char*)w;
        sum += u;
    }
    //将反馈的16位从高位移到低位
    sum = (sum >> 16) + (sum & 0xffff);
    sum += (sum >> 16);
    answer = ~sum;
    return (answer);
}

//发送回应请求函数
int SendEchoRequest(SOCKET s, struct sockaddr_in *lpstToAddr) {
    static ECHOREQUEST echoReq;
    static int nId = 1;
    static int nSeq = 1;
    int nRet;
    //填充回应请求消息
    echoReq.icmpHdr.Type = ICMP_ECHOREQ;
    echoReq.icmpHdr.Code = 0;
    echoReq.icmpHdr.Checksum = 0;
    echoReq.icmpHdr.ID = nId++;
    echoReq.icmpHdr.Seq = nSeq++;
    //填充要发送的数据
    for (nRet = 0; nRet < REQ_DATASIZE; nRet++) {
        echoReq.cData[nRet] = '1' + nRet;
    }
    //存储发送的时间
    echoReq.dwTime = timeGetTime();
    //计算回应请求的校验和
    echoReq.icmpHdr.Checksum = checksum((u_short*)&echoReq, sizeof(ECHOREQUEST));
    //发送回应请求
    nRet = sendto(s,(LPSTR)&echoReq,sizeof(ECHOREQUEST),
                  0,(struct sockaddr*)lpstToAddr,sizeof(SOCKADDR_IN));
    if (nRet == SOCKET_ERROR) {
        printf("send to() error:%d\n", WSAGetLastError());
    }
    return (nRet);
}

//接收应答回复并进行解析
DWORD RecvEchoReply(SOCKET s, LPSOCKADDR_IN lpsaFrom, u_char *pTTL) {
    ECHOREPLY echoReply;
    int nRet;
    int nAddrLen = sizeof(struct sockaddr_in);
    //接收应答回复
    nRet = recvfrom(s,(LPSTR)&echoReply,sizeof(ECHOREPLY),
                    0,(LPSOCKADDR)lpsaFrom,&nAddrLen);
    //检验接收结果

    if (nRet == SOCKET_ERROR) {
        printf("recvfrom() error:%d\n",WSAGetLastError());
    }
    //记录返回的TTL
    *pTTL = echoReply.ipHdr.TTL;
    //返回应答时间
    return(echoReply.echoRequest.dwTime);
}

//等待回应答复,使用select模型
int WaitForEchoReply(SOCKET s) {
    struct timeval timeout;
    fd_set readfds;
    readfds.fd_count = 1;
    readfds.fd_array[0] = s;
    timeout.tv_sec = 1;
    timeout.tv_usec = 0;
    return(select(1, &readfds, NULL, NULL, &timeout));
}

//PING功能实现
void Ping(char *pstrHost,bool logic) {
    SOCKET rawSocket;
    LPHOSTENT lpHost;
    struct sockaddr_in destIP;
    struct sockaddr_in srcIP;
    DWORD dwTimeSent;
    DWORD dwElapsed;
    u_char cTTL;
    int nLoop,k=4;
    int nRet,minimum=100000,maximum=0,average=0;
    int sent=4,reveived=0,lost=0;
    //创建原始套接字,ICMP类型
    rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
    if (rawSocket == SOCKET_ERROR) {
        printf("socket() error:%d\n", WSAGetLastError());
        return;
    }
    //检测目标主机
    lpHost = gethostbyname(pstrHost);
    if (lpHost==NULL) {
        printf("Host not found:%s\n", pstrHost);
        return;
    }
    //设置目标机地址
    destIP.sin_addr.s_addr = *((u_long FAR*)(lpHost->h_addr)); //设置目标IP
    destIP.sin_family = AF_INET;  //地址规格
    destIP.sin_port = 0;
    //提示开始进行PING
    printf("\nPinging %s [%s] with %d bytes of data:\n",pstrHost,inet_ntoa(destIP.sin_addr),REQ_DATASIZE);
    //发起多次PING测试
    for (nLoop=0; nLoop<k; nLoop++) {
        if (logic)k=k+1;
        //发送ICMP回应请求
        SendEchoRequest(rawSocket, &destIP);
        //等待回复的数据
        nRet = WaitForEchoReply(rawSocket);
        if (nRet == SOCKET_ERROR) {
            printf("select() error:%d\n", WSAGetLastError());
            break;
        }
        if (!nRet) {
            lost++;
            printf("\nRequest time out.");
            continue;
        }
        //接收回复
        dwTimeSent = RecvEchoReply(rawSocket, &srcIP, &cTTL);
        reveived++;
        //计算花费的时间
        dwElapsed = timeGetTime() - dwTimeSent;
        if(dwElapsed>maximum)maximum=dwElapsed;
        if(dwElapsed<minimum)minimum=dwElapsed;
        average+=dwElapsed;
        printf("\nReply from %s: bytes = %d time = %ldms TTL = %d",
               inet_ntoa(srcIP.sin_addr),REQ_DATASIZE,dwElapsed,cTTL);
    }
    printf("\n\n");
    printf("Ping statistics for %s:\n",inet_ntoa(srcIP.sin_addr));
    printf("    Packets: Sent = %d, Received = %d, Lost = %d (%.f%% loss),\n",
           sent,reveived,lost,(float)(lost*1.0/sent)*100);
    if(lost==0) {
        printf("Approximate round trip times in milli-seconds:\n");
        printf("    Minimum = %dms, Maximum = %dms, Average = %dms\n",minimum,maximum,average/sent);
    }
    printf("\n\n");
    nRet = closesocket(rawSocket);
    if (nRet == SOCKET_ERROR) {
        printf("closesocket() error:%d\n", WSAGetLastError());
    }
}

void main() {
    printf("Welcome to the Ping Test\n");
    while(1) {
        WSADATA wsd;//检测输入的参数
        //初始化Winsock
        if (WSAStartup(MAKEWORD(1, 1), &wsd) != 0) {
            printf("加载 Winsock 失败!\n");
        }
        char opt1[100];
        char *ptr=opt1;
        bool log=false;
        printf("Ping ");
        cin.getline(opt1,100,'\n');
        if ((opt1[0]=='-')&&(opt1[1]=='t')&&(opt1[2]==' ')) {
            log=true;
            ptr=opt1+3;
        }
        //开始PING
        Ping(ptr,log);
        //程序释放 Winsock 资源
        WSACleanup();
    }
}
赵4老师 2016-06-24
  • 打赏
  • 举报
回复
仅供参考:
#include <windows.h>
#include <stdio.h>
#include <string.h>
char YN(int k) {
    FILE *f;
    char fn[40];
    char ln[80];
    char yn;
    int n;

    yn='N';
    sprintf(fn,"d:\\ping%d.txt",k);
    f=fopen(fn,"r");
    if (NULL!=f) {
        n=0;
        while (1) {
            if (NULL==fgets(ln,80,f)) break;//
            if (strstr(ln,"ms ")) {
                yn='Y';
                break;//
            }
            n++;
            if (n>=4) break;//
        }
        fclose(f);
    }
    return yn;
}
void main(int argc,char **argv) {
    char cmdstr[256];
    int i;
    int IP[3];
    char c;

    if (argc<2) {
    USAGE:
        printf("Usage example:\n    %s 192.168.60.\nto test 192.168.60.1-254\n",argv[0]);
        return;
    }
    if (4==sscanf(argv[1],"%d.%d.%d%c",&IP[0],&IP[1],&IP[2],&c)) {
        if (0<=IP[0] && IP[0]<=255
         && 0<=IP[1] && IP[1]<=255
         && 0<=IP[2] && IP[2]<=255
         && '.'==c) {
            for (i=1;i<255;i++) {
                sprintf(cmdstr,"cmd /c ping %s%d -n 1 -w 1000 >d:\\ping%d.txt",argv[1],i,i);
                WinExec(cmdstr,SW_HIDE);
            }
            Sleep(3000);
            for (i=1;i<255;i++) {
                printf("%c %s%d\n",YN(i),argv[1],i);
            }
            Sleep(3000);
            WinExec("cmd /c del /q d:\\ping*.txt",SW_HIDE);
        } else goto USAGE;
    } else goto USAGE;
}
cattpon 2016-06-24
  • 打赏
  • 举报
回复
感谢整理!!!!!!
dwa4821 2016-06-24
  • 打赏
  • 举报
回复
1111111111111111111111

448

社区成员

发帖
与我相关
我的任务
社区描述
云计算开发
社区管理员
  • 云计算
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧