C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[21323] win32용 ping 소스파일입니다.
김재구 [knis001] 3603 읽음    2002-09-09 10:49
#include <windows.h>
#include <winsock.h>
#include <stdio.h>
#include <string.h>

typedef struct tagIPINFO
{
    u_char Ttl;                // Time To Live
    u_char Tos;                // Type Of Service
    u_char IPFlags;            // IP flags
    u_char OptSize;            // Size of options data
    u_char FAR *Options;    // Options data buffer
}IPINFO, *PIPINFO;

typedef struct tagICMPECHO
{
    u_long Source;            // Source address
    u_long Status;            // IP status
    u_long RTTime;            // Round trip time in milliseconds
    u_short DataSize;        // Reply data size
    u_short Reserved;        // Unknown
    void FAR *pData;        // Reply data buffer
    IPINFO    ipInfo;            // Reply options
}ICMPECHO, *PICMPECHO;


// ICMP.DLL Export Function Pointers
HANDLE (WINAPI *pIcmpCreateFile)(VOID);
BOOL (WINAPI *pIcmpCloseHandle)(HANDLE);
DWORD (WINAPI *pIcmpSendEcho)
    (HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD);

//
//
void main(int argc, char **argv)
{
    WSADATA wsaData;            // WSADATA
    ICMPECHO icmpEcho;            // ICMP Echo reply buffer
    HANDLE hndlIcmp;            // LoadLibrary() handle to ICMP.DLL
    HANDLE hndlFile;            // Handle for IcmpCreateFile()
    LPHOSTENT pHost;            // Pointer to host entry structure
    struct in_addr iaDest;        // Internet address structure
    DWORD *dwAddress;            // IP Address
    IPINFO ipInfo;                // IP Options structure
    int nRet;                    // General use return code
    DWORD dwRet;                // DWORD return code
    int x;

    // Check arguments
    if (argc != 2)
    {
        fprintf(stderr,"\nSyntax: pingi HostNameOrIPAddress\n");
        return;
    }

    // Dynamically load the ICMP.DLL
    hndlIcmp = LoadLibrary("ICMP.DLL");
    if (hndlIcmp == NULL)
    {
        fprintf(stderr,"\nCould not load ICMP.DLL\n");
        return;
    }
    // Retrieve ICMP function pointers
    pIcmpCreateFile = (HANDLE (WINAPI *)(void))
        GetProcAddress(hndlIcmp,"IcmpCreateFile");
    pIcmpCloseHandle = (BOOL (WINAPI *)(HANDLE))
        GetProcAddress(hndlIcmp,"IcmpCloseHandle");
    pIcmpSendEcho = (DWORD (WINAPI *)
        (HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD))
        GetProcAddress(hndlIcmp,"IcmpSendEcho");
    // Check all the function pointers
    if (pIcmpCreateFile == NULL        ||
        pIcmpCloseHandle == NULL    ||
        pIcmpSendEcho == NULL)
    {
        fprintf(stderr,"\nError getting ICMP proc address\n");
        FreeLibrary(hndlIcmp);
        return;
    }

    // Init WinSock
    nRet = WSAStartup(0x0101, &wsaData );
    if (nRet)
    {
        fprintf(stderr,"\nWSAStartup() error: %d\n", nRet);
        WSACleanup();
        FreeLibrary(hndlIcmp);
        return;
    }
    // Check WinSock version
    if (0x0101 != wsaData.wVersion)
    {
        fprintf(stderr,"\nWinSock version 1.1 not supported\n");
        WSACleanup();
        FreeLibrary(hndlIcmp);
        return;
    }

    // Lookup destination
    // Use inet_addr() to determine if we're dealing with a name
    // or an address
    iaDest.s_addr = inet_addr(argv[1]);
    if (iaDest.s_addr == INADDR_NONE)
        pHost = gethostbyname(argv[1]);
    else
        pHost = gethostbyaddr((const char *)&iaDest,
                        sizeof(struct in_addr), AF_INET);
    if (pHost == NULL)
    {
        fprintf(stderr, "\n%s not found\n", argv[1]);
        WSACleanup();
        FreeLibrary(hndlIcmp);
        return;
    }

    // Tell the user what we're doing
    printf("\nPinging %s [%s]", pHost->h_name,
            inet_ntoa((*(LPIN_ADDR)pHost->h_addr_list[0])));

    // Copy the IP address
    dwAddress = (DWORD *)(*pHost->h_addr_list);

    // Get an ICMP echo request handle       
    hndlFile = pIcmpCreateFile();
    for (x = 0; x < 4; x++)
    {
        // Set some reasonable default values
        ipInfo.Ttl = 255;
        ipInfo.Tos = 0;
        ipInfo.IPFlags = 0;
        ipInfo.OptSize = 0;
        ipInfo.Options = NULL;
        //icmpEcho.ipInfo.Ttl = 256;
        // Reqest an ICMP echo
        dwRet = pIcmpSendEcho(
            hndlFile,        // Handle from IcmpCreateFile()
            *dwAddress,        // Destination IP address
            NULL,            // Pointer to buffer to send
            0,                // Size of buffer in bytes
            &ipInfo,        // Request options
            &icmpEcho,        // Reply buffer
            sizeof(struct tagICMPECHO),
            5000);            // Time to wait in milliseconds
        // Print the results
        iaDest.s_addr = icmpEcho.Source;
        printf("\nReply from %s  Time=%ldms  TTL=%d",
                inet_ntoa(iaDest),
                icmpEcho.RTTime,
                icmpEcho.ipInfo.Ttl);
        if (icmpEcho.Status)
        {
            printf("\nError: icmpEcho.Status=%ld",
                icmpEcho.Status);
            break;
        }
    }
    printf("\n");
    // Close the echo request file handle
    pIcmpCloseHandle(hndlFile);
    FreeLibrary(hndlIcmp);
    WSACleanup();
}


+ -

관련 글 리스트
21320 Ping을 수행시키는 프로그램을 어떻게 구현해야 할까요? 통일바라기 1280 2002/09/09
30552     Re:Ping을 수행시키는 프로그램을 어떻게 구현해야 할까요? 김재구 1372 2002/09/09
21323     win32용 ping 소스파일입니다. 김재구 3603 2002/09/09
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.