다음을 통해 공유


IcmpSendEcho 함수(icmpapi.h)

IcmpSendEcho 함수는 IPv4 ICMP 에코 요청을 보내고 모든 에코 응답 응답을 반환합니다. 제한 시간이 만료되었거나 회신 버퍼가 채워지면 호출이 반환됩니다.

구문

IPHLPAPI_DLL_LINKAGE DWORD IcmpSendEcho(
  [in]           HANDLE                 IcmpHandle,
  [in]           IPAddr                 DestinationAddress,
  [in]           LPVOID                 RequestData,
  [in]           WORD                   RequestSize,
  [in, optional] PIP_OPTION_INFORMATION RequestOptions,
  [out]          LPVOID                 ReplyBuffer,
  [in]           DWORD                  ReplySize,
  [in]           DWORD                  Timeout
);

매개 변수

[in] IcmpHandle

IcmpCreateFile 함수에서 반환된 열린 핸들입니다.

[in] DestinationAddress

IPAddr 구조체 형식의 에코 요청의 IPv4 대상 주소입니다.

[in] RequestData

요청에 보낼 데이터가 포함된 버퍼에 대한 포인터입니다.

[in] RequestSize

RequestData 매개 변수가 가리키는 요청 데이터 버퍼의 크기(바이트)입니다.

[in, optional] RequestOptions

요청에 대한 IP 헤더 옵션( IP_OPTION_INFORMATION 구조체 형식)에 대한 포인터입니다. 64비트 플랫폼에서 이 매개 변수는 IP_OPTION_INFORMATION32 구조체의 형식입니다.

IP 헤더 옵션을 지정할 필요가 없는 경우 이 매개 변수는 NULL 일 수 있습니다.

[out] ReplyBuffer

에코 요청에 대한 모든 회신을 저장할 버퍼입니다. 반환 시 버퍼에는 ICMP_ECHO_REPLY 구조의 배열과 회신에 대한 옵션 및 데이터가 포함됩니다. 버퍼는 하나 이상의 ICMP_ECHO_REPLY 구조와 RequestSize 바이트 이상의 데이터를 저장할 수 있을 만큼 커야 합니다.

[in] ReplySize

회신 버퍼의 할당된 크기(바이트)입니다. 버퍼는 하나 이상의 ICMP_ECHO_REPLY 구조와 RequestSize 바이트 이상의 데이터를 저장할 수 있을 만큼 커야 합니다.

또한 이 버퍼는 8바이트 이상의 데이터(ICMP 오류 메시지의 크기)를 보유할 수 있을 만큼 커야 합니다.

[in] Timeout

회신을 기다리는 시간(밀리초)입니다.

반환 값

IcmpSendEcho 함수는 ReplyBuffer에 저장된 ICMP_ECHO_REPLY 구조체의 수를 반환합니다. 각 회신의 상태 구조에 포함됩니다. 반환 값이 0이면 GetLastError 를 호출하여 추가 오류 정보를 확인합니다.

함수가 실패하면 GetLastError 에서 반환된 확장 오류 코드가 다음 값 중 하나일 수 있습니다.

반환 코드 설명
ERROR_INSUFFICIENT_BUFFER
시스템 호출에 전달된 데이터 영역이 너무 작습니다. ReplySize 매개 변수가 ReplyBuffer 매개 변수가 가리키는 버퍼가 너무 작다는 것을 나타내는 경우 이 오류가 반환됩니다.
ERROR_INVALID_PARAMETER
잘못된 매개 변수가 함수에 전달되었습니다. 이 오류는 IcmpHandle 매개 변수에 잘못된 핸들이 포함된 경우 반환됩니다. ReplySize 매개 변수가 ICMP_ECHO_REPLY 구조체의 크기보다 작은 값을 지정하는 경우에도 이 오류가 반환될 수 있습니다.
ERROR_NOT_ENOUGH_MEMORY
메모리가 부족 하 여 작업을 완료할 수 없습니다.
ERROR_NOT_SUPPORTED
요청이 지원되지 않습니다. 이 오류는 로컬 컴퓨터에 IPv4 스택이 없으면 반환됩니다.
IP_BUF_TOO_SMALL
ReplySize 매개 변수에 지정된 ReplyBuffer의 크기가 너무 작습니다.
기타
FormatMessage를 사용하여 반환된 오류에 대한 메시지 문자열을 가져옵니다.

설명

IcmpSendEcho 함수는 지정된 주소로 ICMP 에코 요청을 보내고 ReplyBuffer에 수신 및 저장된 회신 수를 반환합니다. IcmpSendEcho 함수는 동기 함수이며 응답에 대한 Timeout 매개 변수에 지정된 시간을 기다린 후 를 반환합니다. 반환 값이 0이면 GetLastError 를 호출하여 확장된 오류 정보를 확인합니다.

IcmpSendEcho2IcmpSendEcho2Ex 함수는 비동기 작업을 지원하는 IcmpSendEcho의 향상된 버전입니다. IcmpSendEcho2Ex 함수를 사용하면 원본 IP 주소를 지정할 수도 있습니다. 이 기능은 여러 네트워크 인터페이스가 있는 컴퓨터에서 유용합니다.

IPv6의 경우 Icmp6CreateFile, Icmp6SendEcho2Icmp6ParseReplies 함수를 사용합니다.

IcmpSendEcho 함수는 Windows 2000의 Icmp.dll 내보냅니다. IcmpSendEcho 함수는 Windows XP 이상의 Iphlpapi.dll 내보냅니다. 이 함수를 사용하려면 Windows 버전 검사를 사용하지 않는 것이 좋습니다. Windows 2000, Windows XP, Windows Server 2003 이상 Windows 버전에서 이 기능을 사용하여 이식성이 필요한 애플리케이션은 Icmp.lib 또는 Iphlpapi.lib 파일에 정적으로 연결해서는 안 됩니다. 대신 애플리케이션은 LoadLibraryGetProcAddress를 호출하여Iphlpapi.dllIcmpSendEcho가 있는지 검사 합니다. 실패하면 애플리케이션이 LoadLibraryGetProcAddress를 호출하여Icmp.dllIcmpSendEcho가 있는지 검사 합니다.

Iphlpapi.h 헤더 파일에 대한 include 지시문은 Icmpapi.h 헤더 파일 앞에 배치해야 합니다.

예제

다음 예제에서는 명령줄에 지정된 IP 주소로 ICMP 에코 요청을 보내고 첫 번째 응답에서 받은 정보를 출력합니다.

#include <winsock2.h>
#include <iphlpapi.h>
#include <icmpapi.h>
#include <stdio.h>

#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")

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

    // Declare and initialize variables
    
    HANDLE hIcmpFile;
    unsigned long ipaddr = INADDR_NONE;
    DWORD dwRetVal = 0;
    char SendData[32] = "Data Buffer";
    LPVOID ReplyBuffer = NULL;
    DWORD ReplySize = 0;
    
    // Validate the parameters
    if (argc != 2) {
        printf("usage: %s IP address\n", argv[0]);
        return 1;
    }

    ipaddr = inet_addr(argv[1]);
    if (ipaddr == INADDR_NONE) {
        printf("usage: %s IP address\n", argv[0]);
        return 1;
    }
    
    hIcmpFile = IcmpCreateFile();
    if (hIcmpFile == INVALID_HANDLE_VALUE) {
        printf("\tUnable to open handle.\n");
        printf("IcmpCreatefile returned error: %ld\n", GetLastError() );
        return 1;
    }    

    ReplySize = sizeof(ICMP_ECHO_REPLY) + sizeof(SendData);
    ReplyBuffer = (VOID*) malloc(ReplySize);
    if (ReplyBuffer == NULL) {
        printf("\tUnable to allocate memory\n");
        return 1;
    }    
    
    
    dwRetVal = IcmpSendEcho(hIcmpFile, ipaddr, SendData, sizeof(SendData), 
        NULL, ReplyBuffer, ReplySize, 1000);
    if (dwRetVal != 0) {
        PICMP_ECHO_REPLY pEchoReply = (PICMP_ECHO_REPLY)ReplyBuffer;
        struct in_addr ReplyAddr;
        ReplyAddr.S_un.S_addr = pEchoReply->Address;
        printf("\tSent icmp message to %s\n", argv[1]);
        if (dwRetVal > 1) {
            printf("\tReceived %ld icmp message responses\n", dwRetVal);
            printf("\tInformation from the first response:\n"); 
        }    
        else {    
            printf("\tReceived %ld icmp message response\n", dwRetVal);
            printf("\tInformation from this response:\n"); 
        }    
        printf("\t  Received from %s\n", inet_ntoa( ReplyAddr ) );
        printf("\t  Status = %ld\n", 
            pEchoReply->Status);
        printf("\t  Roundtrip time = %ld milliseconds\n", 
            pEchoReply->RoundTripTime);
    }
    else {
        printf("\tCall to IcmpSendEcho failed.\n");
        printf("\tIcmpSendEcho returned error: %ld\n", GetLastError() );
        return 1;
    }
    return 0;
}    
    

요구 사항

   
지원되는 최소 클라이언트 Windows 2000 Professional[데스크톱 앱만]
지원되는 최소 서버 Windows 2000 Server[데스크톱 앱만]
대상 플랫폼 Windows
헤더 icmpapi.h
라이브러리 Iphlpapi.lib
DLL Windows Server 2008, Windows Vista, Windows Server 2003 및 Windows XP의 Iphlpapi.dll. Windows 2000 Server 및 Windows 2000 Professional의 Icmp.dll

참고 항목

GetLastError

ICMP_ECHO_REPLY

IPAddr

IP_OPTION_INFORMATION

IP_OPTION_INFORMATION32

Icmp6CreateFile

Icmp6ParseReplies

Icmp6SendEcho2

IcmpCloseHandle

IcmpCreateFile

IcmpParseReplies

IcmpSendEcho2

IcmpSendEcho2Ex