ComputerBooks.ru - Электронные книги, самоучители.

 
Электронные кники доступные для скачивания
На главную Добавить в избранное Форма отправки почты Если книг читать не будешь - скоро грамоту забудешь!

49. FAQ o Win API

Q> Как послать пинг?

A> Есть в кишках Windows icmp.dll. Юзать надо именно её.

//
// PingI.c -- Simple ping program using the proprietary 
//                        Microsoft ICMP API
//                         Автор неизвестен
 
#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();
}

2000(c)

Электронные Книги по компьютерным программам
На правах рекламы:
Поставщики кабеля, продаю кабель, кабельный инструмент
-->

Для добавления страницы электронной книги в избранное нажмине Ctrl+D
Поставщики кабеля, продаю кабель, кабельный инструмент

Книги | Статьи | Скачать

Правовая информация   

  © ComputerBooks.ru,
  При копировании материалов со страницы обязательно разместите ссылку на источник.