当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++进阶与实例

ping命令源代码

    /******************************************************************************\
    * ping.c - Simple ping utility using SOCK_RAW
    *
    * This is a part of the Microsoft Source Code Samples.
    * Copyright 1996-1997 Microsoft Corporation.
    * All rights reserved.
    * This source code is only intended as a supplement to
    * Microsoft Development Tools and/or WinHelp documentation.
    * See these sources for detailed information regarding the
    * Microsoft samples programs.
    \******************************************************************************/


    #pragma pack(4)

    #define WIN32_LEAN_AND_MEAN
    #include
    #include
    #include

    #define ICMP_ECHO 8
    #define ICMP_ECHOREPLY 0

    #define ICMP_MIN 8 // minimum 8 byte icmp packet (just header)

    /* The IP header */
    typedef struct iphdr {
    unsigned int h_len:4; // length of the header
    unsigned int version:4; // Version of IP
    unsigned char tos; // Type of service
    unsigned short total_len; // total length of the packet
    unsigned short ident; // unique identifier
    unsigned short frag_and_flags; // flags
    unsigned char ttl;
    unsigned char proto; // protocol (TCP, UDP etc)
    unsigned short checksum; // IP checksum

    unsigned int sourceIP;
    unsigned int destIP;

    }IpHeader;

    //
    // ICMP header
    //
    typedef struct _ihdr {
    BYTE i_type;
    BYTE i_code; /* type sub code */
    USHORT i_cksum;
    USHORT i_id;
    USHORT i_seq;
    /* This is not the std header, but we reserve space for time */
    ULONG timestamp;
    }IcmpHeader;

    #define STATUS_FAILED 0xFFFF
    #define DEF_PACKET_SIZE 32
    #define MAX_PACKET 1024

    #define xmalloc(s) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(s))
    #define xfree(p) HeapFree (GetProcessHeap(),0,(p))

    void fill_icmp_data(char *, int);
    USHORT checksum(USHORT *, int);
    void decode_resp(char *,int ,struct sockaddr_in *);

    void Usage(char *progname){

    fprintf(stderr,"Usage:\n");
    fprintf(stderr,"%s [data_size]\n",progname);
    fprintf(stderr,"datasize can be up to 1Kb\n");
    ExitProcess(STATUS_FAILED);

    }
    int main(int argc, char **argv){

    WSADATA wsaData;
    SOCKET sockRaw;
    struct sockaddr_in dest,from;
    struct hostent * hp;
    int bread,datasize;
    int fromlen = sizeof(from);
    int timeout = 1000;
    char *dest_ip;
    char *icmp_data;
    char *recvbuf;
    unsigned int addr=0;
    USHORT seq_no = 0;

    if (WSAStartup(MAKEWORD(2,1),&wsaData) != 0){
    fprintf(stderr,"WSAStartup failed: %d\n",GetLastError());
    ExitProcess(STATUS_FAILED);
    }

    if (argc <2 ) {
    Usage(argv[0]);
    }
    sockRaw = WSASocket (AF_INET,
    SOCK_RAW,
    IPPROTO_ICMP,
    NULL, 0,0);

    if (sockRaw == INVALID_SOCKET) {
    fprintf(stderr,"WSASocket() failed: %d\n",WSAGetLastError());
    ExitProcess(STATUS_FAILED);
    }
    bread = setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,
    sizeof(timeout));
    if(bread == SOCKET_ERROR) {
    fprintf(stderr,"failed to set recv timeout: %d\n",WSAGetLastError());
    ExitProcess(STATUS_FAILED);
    }
    timeout = 1000;
    bread = setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,
    sizeof(timeout));
    if(bread == SOCKET_ERROR) {
    fprintf(stderr,"failed to set send timeout: %d\n",WSAGetLastError());
    ExitProcess(STATUS_FAILED);
    }
    memset(&dest,0,sizeof(dest));

    hp = gethostbyname(argv[1]);

    if (!hp){
    addr = inet_addr(argv[1]);
    }
    if ((!hp) && (addr == INADDR_NONE) ) {
    fprintf(stderr,"Unable to resolve %s\n",argv[1]);
    ExitProcess(STATUS_FAILED);
    }

 

共3页 首页 上一页 1 2 3 下一页 尾页 跳转到
相关内容
赞助商链接