GetAdaptersInfo 함수(iphlpapi.h)
GetAdaptersInfo 함수는 로컬 컴퓨터에 대한 어댑터 정보를 검색합니다.
Windows XP 이상에서: GetAdaptersInfo 대신 GetAdaptersAddresses 함수를 사용합니다.
구문
IPHLPAPI_DLL_LINKAGE ULONG GetAdaptersInfo(
[out] PIP_ADAPTER_INFO AdapterInfo,
[in, out] PULONG SizePointer
);
매개 변수
[out] AdapterInfo
연결된 IP_ADAPTER_INFO 구조 목록을 수신하는 버퍼에 대한 포인터입니다.
[in, out] SizePointer
pAdapterInfo 매개 변수가 가리키는 버퍼의 크기를 지정하는 ULONG 변수에 대한 포인터입니다. 이 크기가 어댑터 정보를 보유하기에 충분하지 않은 경우 GetAdaptersInfo 는 이 변수를 필요한 크기로 채우고 ERROR_BUFFER_OVERFLOW 오류 코드를 반환합니다.
반환 값
함수가 성공하면 반환 값이 ERROR_SUCCESS ( NO_ERROR 동일한 값으로 정의됨).
함수가 실패하면 반환 값은 다음 오류 코드 중 하나입니다.
반환 코드 | 설명 |
---|---|
|
어댑터 정보를 받을 버퍼가 너무 작습니다. pOutBufLen 매개 변수로 표시된 버퍼 크기가 너무 작아 어댑터 정보를 저장할 수 없거나 pAdapterInfo 매개 변수가 NULL 포인터인 경우 이 값이 반환됩니다. 이 오류 코드가 반환되면 pOutBufLen 매개 변수는 필요한 버퍼 크기를 가리킵니다. |
|
어댑터 정보가 잘못 검색되었습니다. |
|
매개 변수 중 하나가 잘못되었습니다. pOutBufLen 매개 변수가 NULL 포인터이거나 호출 프로세스에 pOutBufLen이 가리키는 메모리에 대한 읽기/쓰기 액세스 권한이 없거나 호출 프로세스에 pAdapterInfo 매개 변수가 가리키는 메모리에 대한 쓰기 권한이 없는 경우 이 오류가 반환됩니다. |
|
로컬 컴퓨터에 대한 어댑터 정보가 없습니다. |
|
GetAdaptersInfo 함수는 로컬 컴퓨터에서 실행되는 운영 체제에서 지원되지 않습니다. |
|
함수가 실패하면 FormatMessage를 사용하여 반환된 오류에 대한 메시지 문자열을 가져옵니다. |
설명
GetAdaptersInfo 함수는 IPv4 주소에 대해서만 정보를 검색할 수 있습니다.
Windows 10 이전 버전에서는 이 함수에서 반환된 목록에 어댑터가 표시되는 순서를 네트워크 연결 폴더에서 제어할 수 있습니다. 고급 메뉴에서 고급 설정 메뉴 항목을 선택합니다. Windows 10 순서는 지정되지 않습니다.
GetAdaptersInfo 및 GetInterfaceInfo 함수는 IPv4 루프백 인터페이스에 대한 정보를 반환하지 않습니다. 루프백 인터페이스에 대한 정보는 GetIpAddrTable 함수에서 반환됩니다.
Windows XP 이상에서: GetAdaptersInfo에서 반환하는 어댑터 목록에는 단방향 어댑터가 포함됩니다. 데이터를 보내고 받을 수 있는 어댑터 목록을 생성하려면 GetUniDirectionalAdapterInfo를 호출하고 GetAdaptersInfo에서 반환된 목록에서 반환된 어댑터를 제외합니다.
예제
이 예제에서는 어댑터 정보를 검색하고 각 어댑터의 다양한 속성을 출력합니다.
#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib, "IPHLPAPI.lib")
#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
/* Note: could also use malloc() and free() */
int __cdecl main()
{
/* Declare and initialize variables */
// It is possible for an adapter to have multiple
// IPv4 addresses, gateways, and secondary WINS servers
// assigned to the adapter.
//
// Note that this sample code only prints out the
// first entry for the IP address/mask, and gateway, and
// the primary and secondary WINS server for each adapter.
PIP_ADAPTER_INFO pAdapterInfo;
PIP_ADAPTER_INFO pAdapter = NULL;
DWORD dwRetVal = 0;
UINT i;
/* variables used to print DHCP time info */
struct tm newtime;
char buffer[32];
errno_t error;
ULONG ulOutBufLen = sizeof (IP_ADAPTER_INFO);
pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC(sizeof (IP_ADAPTER_INFO));
if (pAdapterInfo == NULL) {
printf("Error allocating memory needed to call GetAdaptersinfo\n");
return 1;
}
// Make an initial call to GetAdaptersInfo to get
// the necessary size into the ulOutBufLen variable
if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) {
FREE(pAdapterInfo);
pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC(ulOutBufLen);
if (pAdapterInfo == NULL) {
printf("Error allocating memory needed to call GetAdaptersinfo\n");
return 1;
}
}
if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR) {
pAdapter = pAdapterInfo;
while (pAdapter) {
printf("\tComboIndex: \t%d\n", pAdapter->ComboIndex);
printf("\tAdapter Name: \t%s\n", pAdapter->AdapterName);
printf("\tAdapter Desc: \t%s\n", pAdapter->Description);
printf("\tAdapter Addr: \t");
for (i = 0; i < pAdapter->AddressLength; i++) {
if (i == (pAdapter->AddressLength - 1))
printf("%.2X\n", (int) pAdapter->Address[i]);
else
printf("%.2X-", (int) pAdapter->Address[i]);
}
printf("\tIndex: \t%d\n", pAdapter->Index);
printf("\tType: \t");
switch (pAdapter->Type) {
case MIB_IF_TYPE_OTHER:
printf("Other\n");
break;
case MIB_IF_TYPE_ETHERNET:
printf("Ethernet\n");
break;
case MIB_IF_TYPE_TOKENRING:
printf("Token Ring\n");
break;
case MIB_IF_TYPE_FDDI:
printf("FDDI\n");
break;
case MIB_IF_TYPE_PPP:
printf("PPP\n");
break;
case MIB_IF_TYPE_LOOPBACK:
printf("Loopback\n");
break;
case MIB_IF_TYPE_SLIP:
printf("Slip\n");
break;
default:
printf("Unknown type %ld\n", pAdapter->Type);
break;
}
printf("\tIP Address: \t%s\n",
pAdapter->IpAddressList.IpAddress.String);
printf("\tIP Mask: \t%s\n", pAdapter->IpAddressList.IpMask.String);
printf("\tGateway: \t%s\n", pAdapter->GatewayList.IpAddress.String);
printf("\t***\n");
if (pAdapter->DhcpEnabled) {
printf("\tDHCP Enabled: Yes\n");
printf("\t DHCP Server: \t%s\n",
pAdapter->DhcpServer.IpAddress.String);
printf("\t Lease Obtained: ");
/* Display local time */
error = _localtime32_s(&newtime, (__time32_t*) &pAdapter->LeaseObtained);
if (error)
printf("Invalid Argument to _localtime32_s\n");
else {
// Convert to an ASCII representation
error = asctime_s(buffer, 32, &newtime);
if (error)
printf("Invalid Argument to asctime_s\n");
else
/* asctime_s returns the string terminated by \n\0 */
printf("%s", buffer);
}
printf("\t Lease Expires: ");
error = _localtime32_s(&newtime, (__time32_t*) &pAdapter->LeaseExpires);
if (error)
printf("Invalid Argument to _localtime32_s\n");
else {
// Convert to an ASCII representation
error = asctime_s(buffer, 32, &newtime);
if (error)
printf("Invalid Argument to asctime_s\n");
else
/* asctime_s returns the string terminated by \n\0 */
printf("%s", buffer);
}
} else
printf("\tDHCP Enabled: No\n");
if (pAdapter->HaveWins) {
printf("\tHave Wins: Yes\n");
printf("\t Primary Wins Server: %s\n",
pAdapter->PrimaryWinsServer.IpAddress.String);
printf("\t Secondary Wins Server: %s\n",
pAdapter->SecondaryWinsServer.IpAddress.String);
} else
printf("\tHave Wins: No\n");
pAdapter = pAdapter->Next;
printf("\n");
}
} else {
printf("GetAdaptersInfo failed with error: %d\n", dwRetVal);
}
if (pAdapterInfo)
FREE(pAdapterInfo);
return 0;
}
요구 사항
지원되는 최소 클라이언트 | Windows 2000 Professional[데스크톱 앱만] |
지원되는 최소 서버 | Windows 2000 Server[데스크톱 앱만] |
대상 플랫폼 | Windows |
헤더 | iphlpapi.h |
라이브러리 | Iphlpapi.lib |
DLL | Iphlpapi.dll |