다음을 통해 공유


SendARP 함수(iphlpapi.h)

SendARP 함수는 지정된 대상 IPv4 주소에 해당하는 실제 주소를 얻기 위해 ARP(주소 확인 프로토콜) 요청을 보냅니다.

구문

IPHLPAPI_DLL_LINKAGE DWORD SendARP(
  [in]      IPAddr DestIP,
  [in]      IPAddr SrcIP,
  [out]     PVOID  pMacAddr,
  [in, out] PULONG PhyAddrLen
);

매개 변수

[in] DestIP

대상 IPv4 주소( IPAddr 구조체 형식)입니다. ARP 요청은 이 IPv4 주소에 해당하는 실제 주소를 가져오려고 시도합니다.

[in] SrcIP

보낸 사람의 원본 IPv4 주소( IPAddr 구조체 형식)입니다. 이 매개 변수는 선택 사항이며 ARP 항목에 대한 요청을 보낼 인터페이스를 선택하는 데 사용됩니다. 호출자는 이 매개 변수의 INADDR_ANY IPv4 주소에 해당하는 0을 지정할 수 있습니다.

[out] pMacAddr

ULONG 변수 배열에 대한 포인터입니다. 이 배열에는 이더넷 또는 토큰 링 실제 주소를 보유할 ULONG 요소가 두 개 이상 있어야 합니다. 이 배열의 처음 6바이트는 DestIP 매개 변수로 지정된 IPv4 주소에 해당하는 실제 주소를 받습니다.

[in, out] PhyAddrLen

입력 시 최대 버퍼 크기(바이트)를 지정하는 ULONG 값에 대한 포인터는 애플리케이션이 실제 주소 또는 MAC 주소를 수신하도록 따로 설정했습니다. 버퍼 크기는 이더넷 또는 토큰 링 실제 주소에 대해 6바이트 이상이어야 합니다.

실제 주소를 받을 버퍼는 pMacAddr 매개 변수를 가리켰습니다.

성공적인 출력에서 이 매개 변수는 pMacAddr가 가리키는 버퍼에 기록된 바이트 수를 지정하는 값을 가리킵니다.

반환 값

함수가 성공하면 반환 값이 NO_ERROR.

함수가 실패하면 반환 값은 다음 오류 코드 중 하나입니다.

반환 코드 설명
ERROR_BAD_NET_NAME
네트워크 이름을 찾을 수 없습니다. 이 오류는 Windows Vista 이상에서 SendARP 요청에 대한 ARP 응답을 받지 못한 경우에 반환됩니다. 이 오류는 대상 IPv4 주소가 동일한 서브넷에 없거나 대상 컴퓨터가 작동되지 않아 연결할 수 없는 경우에 발생합니다.
ERROR_BUFFER_OVERFLOW
파일 이름이 너무 깁니다. 이 오류는 PhyAddrLen 매개 변수가 가리키는 ULONG 값이 전체 실제 주소를 저장하는 데 필요한 크기인 6보다 작은 경우 Windows Vista에서 반환됩니다.
ERROR_GEN_FAILURE
시스템에 연결된 디바이스가 작동하지 않습니다. 이 오류는 SendARP 요청에 대한 ARP 응답을 받지 못한 경우 Windows Server 2003 이하에서 반환됩니다. 이 오류는 대상 IPv4 주소가 동일한 서브넷에 없거나 대상 컴퓨터가 작동하지 않아 연결할 수 없는 경우에 발생할 수 있습니다.
ERROR_INVALID_PARAMETER
매개 변수 중 하나가 잘못되었습니다. pMacAddr 또는 PhyAddrLen 매개 변수가 NULL 포인터인 경우 이 오류는 Windows Server 2003 이하에서 반환됩니다.
ERROR_INVALID_USER_BUFFER
제공된 사용자 버퍼가 요청된 작업에 잘못되었습니다. 이 오류는 PhyAddrLen 매개 변수가 가리키는 ULONG 값이 0이면 Windows Server 2003 이하에서 반환됩니다.
ERROR_NOT_FOUND
Element not found. SrcIp 매개 변수가 로컬 컴퓨터의 인터페이스 또는 INADDR_ANY IP 주소(0.0.0.0의 IPv4 주소)에서 원본 IPv4 주소를 지정하지 않으면 이 오류가 Windows Vista에서 반환됩니다.
ERROR_NOT_SUPPORTED
SendARP 함수는 로컬 컴퓨터에서 실행되는 운영 체제에서 지원되지 않습니다.
기타
함수가 실패하면 FormatMessage를 사용하여 반환된 오류에 대한 메시지 문자열을 가져옵니다.

설명

SendARP 함수는 지정된 대상 IPv4 주소에 해당하는 물리적 하드웨어 주소(MAC 주소라고도 함)를 요청하는 데 사용됩니다. 요청된 정보가 로컬 컴퓨터의 ARP 테이블에 없는 경우 SendARP 함수로 인해 실제 주소를 얻기 위해 ARP 요청이 전송됩니다. 함수가 성공하면 지정된 대상 IPv4 주소에 해당하는 실제 주소가 pMacAddr 매개 변수가 가리키는 배열에 반환됩니다.

IPv4 주소의 실제 주소는 대상 IPv4 주소가 로컬 서브넷에 있는 경우에만 사용할 수 있습니다(라우터를 거치지 않고 IPv4 주소에 직접 연결할 수 있음). 대상 IPv4 주소가 로컬 서브넷에 없는 경우 SendARP 함수가 실패합니다.

Windows Vista 이상에서 SendARP 함수가 성공하면 로컬 컴퓨터의 ARP 테이블이 결과로 업데이트됩니다. SendARP 함수가 Windows Server 2003 이하에서 성공한 경우 로컬 컴퓨터의 ARP 테이블은 영향을 받지 않습니다.

Windows Vista 및 이후의 SendARP 함수는 Windows Server 2003 이하의 SendARP 함수와 다른 오류 반환 값을 반환합니다.

Windows Vista 이상에서는 PMacAddr 또는 PhyAddrLen 매개 변수로 전달된 NULL 포인터가 SendARP 함수에 전달되면 액세스 위반이 발생하고 애플리케이션이 종료됩니다. Windows Vista 이상에서 오류가 발생하고 ERROR_BAD_NET_NAME, ERROR_BUFFER_OVERFLOW 또는 ERROR_NOT_FOUND 반환되면 PhyAddrLen 매개 변수가 가리키는 ULONG 값이 0으로 설정됩니다. PhyAddrLen 매개 변수가 가리키는 ULONG 값이 Windows Vista 이상에서 6보다 작으면 SendARP 함수는 물리적 주소를 받을 버퍼가 너무 작음을 나타내는 ERROR_BUFFER_OVERFLOW 반환합니다. SrcIp 매개 변수가 로컬 컴퓨터의 인터페이스가 아닌 IPv4 주소를 지정하는 경우 Windows Vista의 SendARP 함수는 ERROR_NOT_FOUND 반환합니다.

Windows Server 2003 이하에서는 pMacAddr 또는 PhyAddrLen 매개 변수로 전달된 NULL 포인터가 SendARP 함수에 ERROR_INVALID_PARAMETER 반환합니다. Windows Server 2003 및 이전 버전에서 오류가 발생하고 ERROR_GEN_FAILURE 또는 ERROR_INVALID_USER_BUFFER 반환되면 PhyAddrLen 매개 변수가 가리키는 ULONG 값이 0으로 설정됩니다. PhyAddrLen 매개 변수가 가리키는 ULONG 값이 Windows Server 2003 이하에서 6보다 작은 경우 SendARP 함수는 오류를 반환하지 않고 pMacAddr 매개 변수가 가리키는 배열에서 하드웨어 주소의 일부만 반환합니다. 따라서 PhyAddrLen 매개 변수가 가리키는 값이 4이면 하드웨어 주소의 처음 4바이트만 pMacAddr 매개 변수가 가리키는 배열에 반환됩니다. SrcIp 매개 변수가 로컬 컴퓨터의 인터페이스가 아닌 IPv4 주소를 지정하는 경우 Windows Server 2003 이하의 SendARP 함수는 SrcIp 매개 변수를 무시하고 원본 IPv4 주소에 대해 로컬 컴퓨터의 IPv4 주소를 사용합니다.

GetIpNetTable 함수는 IPv4 주소를 실제 주소에 매핑하는 로컬 컴퓨터의 ARP 테이블을 검색합니다.

CreateIpNetEntry 함수는 로컬 컴퓨터의 ARP 테이블에 ARP 항목을 만듭니다.

DeleteIpNetEntry 함수는 로컬 컴퓨터의 ARP 테이블에서 ARP 항목을 삭제합니다.

SetIpNetEntry 함수는 로컬 컴퓨터의 ARP 테이블에 있는 기존 ARP 항목을 수정합니다.

FlushIpNetTable 함수는 로컬 컴퓨터의 ARP 테이블에서 지정된 인터페이스에 대한 모든 ARP 항목을 삭제합니다.

Windows Vista 이상에서는 ResolveIpNetEntry2 함수를 사용하여 SendARP 함수를 바꿀 수 있습니다. ResolveIpNetEntry2 함수에 전달된 MIB_IPNET_ROW2 구조체의 Address 멤버가 IPv4 주소인 경우 ARP 요청이 전송됩니다.

Windows Vista에서는 이러한 함수에 전달된 MIB_IPNET_ROW2 구조체의 Address 멤버가 IPv4 주소인 경우 새 함수 그룹을 사용하여 ARP 테이블 항목에 액세스, 수정 및 삭제할 수 있습니다. 새 함수에는 GetIpNetTable2, CreateIpNetEntry2, DeleteIpNetEntry2, FlushIpNetTable2SetIpNetEntry2가 포함됩니다.

IPAddr 데이터 형식에 대한 자세한 내용은 Windows 데이터 형식을 참조하세요. 점선 10진수 표기법과 IPAddr 형식 간에 IP 주소를 변환하려면 inet_addrinet_ntoa 함수를 사용합니다.

예제

다음 코드에서는 지정된 IPv4 주소와 연결된 하드웨어 또는 MAC(미디어 액세스 제어) 주소를 가져오는 방법을 보여 줍니다.

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

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

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

void usage(char *pname)
{
    printf("Usage: %s [options] ip-address\n", pname);
    printf("\t -h \t\thelp\n");
    printf("\t -l length \tMAC physical address length to set\n");
    printf("\t -s src-ip \tsource IP address\n");
    exit(1);
}

int __cdecl main(int argc, char **argv)
{
    DWORD dwRetVal;
    IPAddr DestIp = 0;
    IPAddr SrcIp = 0;       /* default for src ip */
    ULONG MacAddr[2];       /* for 6-byte hardware addresses */
    ULONG PhysAddrLen = 6;  /* default to length of six bytes */

    char *DestIpString = NULL;
    char *SrcIpString = NULL;

    BYTE *bPhysAddr;
    unsigned int i;

    if (argc > 1) {
        for (i = 1; i < (unsigned int) argc; i++) {
            if ((argv[i][0] == '-') || (argv[i][0] == '/')) {
                switch (tolower(argv[i][1])) {
                case 'l':
                    PhysAddrLen = (ULONG) atol(argv[++i]);
                    break;
                case 's':
                    SrcIpString = argv[++i];
                    SrcIp = inet_addr(SrcIpString);
                    break;
                case 'h':
                default:
                    usage(argv[0]);
                    break;
                }               /* end switch */
            } else
                DestIpString = argv[i];
        }                       /* end for */
    } else
        usage(argv[0]);

    if (DestIpString == NULL || DestIpString[0] == '\0')
        usage(argv[0]);

    DestIp = inet_addr(DestIpString);

    memset(&MacAddr, 0xff, sizeof (MacAddr));

    printf("Sending ARP request for IP address: %s\n", DestIpString);

    dwRetVal = SendARP(DestIp, SrcIp, &MacAddr, &PhysAddrLen);

    if (dwRetVal == NO_ERROR) {
        bPhysAddr = (BYTE *) & MacAddr;
        if (PhysAddrLen) {
            for (i = 0; i < (int) PhysAddrLen; i++) {
                if (i == (PhysAddrLen - 1))
                    printf("%.2X\n", (int) bPhysAddr[i]);
                else
                    printf("%.2X-", (int) bPhysAddr[i]);
            }
        } else
            printf
                ("Warning: SendArp completed successfully, but returned length=0\n");

    } else {
        printf("Error: SendArp failed with error: %d", dwRetVal);
        switch (dwRetVal) {
        case ERROR_GEN_FAILURE:
            printf(" (ERROR_GEN_FAILURE)\n");
            break;
        case ERROR_INVALID_PARAMETER:
            printf(" (ERROR_INVALID_PARAMETER)\n");
            break;
        case ERROR_INVALID_USER_BUFFER:
            printf(" (ERROR_INVALID_USER_BUFFER)\n");
            break;
        case ERROR_BAD_NET_NAME:
            printf(" (ERROR_GEN_FAILURE)\n");
            break;
        case ERROR_BUFFER_OVERFLOW:
            printf(" (ERROR_BUFFER_OVERFLOW)\n");
            break;
        case ERROR_NOT_FOUND:
            printf(" (ERROR_NOT_FOUND)\n");
            break;
        default:
            printf("\n");
            break;
        }
    }

    return 0;
}


요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 2000 Professional[데스크톱 앱만]
지원되는 최소 서버 Windows 2000 Server[데스크톱 앱만]
대상 플랫폼 Windows
헤더 iphlpapi.h
라이브러리 Iphlpapi.lib
DLL Iphlpapi.dll

추가 정보

CreateIpNetEntry

CreateIpNetEntry2

CreateProxyArpEntry

DeleteIpNetEntry

DeleteIpNetEntry2

DeleteProxyArpEntry

FlushIpNetTable

FlushIpNetTable2

GetIpNetEntry2

GetIpNetTable2

IP 도우미 함수 참조

IP 도우미 시작 페이지

IPAddr

ResolveIpNetEntry2

SetIpNetEntry

SetIpNetEntry2