티스토리 뷰
기술(Tech, IT)/네트워크 (Networking)
[Networking] GetAdaptersAddresses function (iphlpapi.h)
Daniel803 2024. 5. 17. 02:01GetAdaptersAddresses 함수는 로컬 컴퓨터의 네트워크 어댑터에 대한 정보를 검색하는 데 사용되는 Windows API 함수다. 이 함수는 IPv4 및 IPv6 주소와 기타 어댑터 관련 정보를 포함한 포괄적인 세부 정보를 제공한다. 이 함수는 IPv6 및 추가 어댑터 정보를 지원해 GetAdaptersInfo에 비해 더 현대적이고 다양한 기능을 제공하기에 이전 함수인 GetAdaptersInfo에 비해 선호된다. 이 함수는 반환되는 대량의 데이터를 처리하기 위해 적절한 버퍼 관리가 필요하므로 최신 네트워크 애플리케이션에 더 유연하고 미래 지향적이다.
ULONG GetAdaptersAddresses(
ULONG Family,
ULONG Flags,
PVOID Reserved,
PIP_ADAPTER_ADDRESSES AdapterAddresses,
PULONG SizePointer
);
- 매개변수
- Family (IN parameter)
- 타입: ULONG
- 설명
: 주소 패밀리를 지정한다. IPv4의 경우 AF_INET, IPv6의 경우 AF_INET6, IPv4와 IPv6 모두의 경우 AF_UNSPEC이 될 수 있다.
- Flags
- 타입: ULONG
- 설명
: 함수의 동작을 수정하는 플래그의 조합이다. 많이 사용되는 플래그는 아래와 같다.
- GAA_FLAG_SKIP_UNICAST : unicast 주소를 건너뛴다.
- GAA_FLAG_SKIP_ANYCAST : anycast 주소를 건너뛴다.
- GAA_FLAG_SKIP_MULTICAST : multicast 주소를 건너뛴다.
- GAA_FLAG_SKIP_DNS_SERVER : DNS 서버 주소를 건너뛴다.
- GAA_FLAG_INCLUDE_PREFIX : 접두사 정보를 포함한다.
- Reserved (IN parameter)
- 타입: PVOID
- 설명
: 향후 사용을 위해 예약됐고(reserved), 반드시 NULL로 설정해야 한다.
- AdapterAddresses (OUT parameter)
- 타입: PIP_ADAPTER_ADDRESSES
- 설명
: 어댑터 주소를 수신하는 버퍼에 대한 포인터다. 이 버퍼는 호출자가 할당해야 한다.
- SizePointer (INOUT parameter)
- 타입: PULONG
- 설명
: 입력 시 이 매개변수는 AdapterAddresses가 가리키는 버퍼의 크기를 지정한다. 출력 시에는 제공된 버퍼가 너무 작으면 필요한 버퍼 크기를 받는다.
- Family (IN parameter)
- 반환 값
: 이 함수는 함수 호출 상태를 나타내는 ULONG을 반환한다. 가능한 반환 값은 아래와 같다.- NO_ERROR
: 함수가 성공했다 - ERROR_BUFFER_OVERFLOW
: 어댑터 주소가 가리키는 버퍼가 너무 작아서 반환된 데이터를 담을 수 없다. 필요한 버퍼 크기는 SizePointer로 반환된다. - 기타 오류 코드는 Windows API 문서에 정의되어 있다.
- NO_ERROR
- 사용 예시
: 아래는 GetAdaptersAddresses를 사용해 네트워크 어댑터 세부 정보를 검생하는 방법의 예시다.
#include <iostream>
#include <Windows.h>
#include <iphlpapi.h>
#include <vector>
#include <string>
#pragma comment(lib, "IPHLPAPI.lib")
struct NetworkInterface {
std::string adapterName;
std::string description;
std::string macAddress;
};
std::vector<NetworkInterface> getNetworkInterfaces() {
std::vector<NetworkInterface> interfaces;
ULONG bufferSize = 0;
// Initial call to determine the required buffer size
GetAdaptersAddresses(AF_UNSPEC, 0, nullptr, nullptr, &bufferSize);
// Allocate the required buffer
IP_ADAPTER_ADDRESSES* adapterAddresses = (IP_ADAPTER_ADDRESSES*)malloc(bufferSize);
// Call to get the actual adapter addresses
if (GetAdaptersAddresses(AF_UNSPEC, 0, nullptr, adapterAddresses, &bufferSize) == NO_ERROR) {
IP_ADAPTER_ADDRESSES* adapter = adapterAddresses;
while (adapter) {
NetworkInterface iface;
iface.adapterName = adapter->AdapterName;
iface.description = adapter->Description;
char macAddr[18];
snprintf(macAddr, sizeof(macAddr), "%02X:%02X:%02X:%02X:%02X:%02X",
adapter->PhysicalAddress[0], adapter->PhysicalAddress[1],
adapter->PhysicalAddress[2], adapter->PhysicalAddress[3],
adapter->PhysicalAddress[4], adapter->PhysicalAddress[5]);
iface.macAddress = macAddr;
interfaces.push_back(iface);
adapter = adapter->Next;
}
} else {
std::cerr << "GetAdaptersAddresses failed." << std::endl;
}
// Clean up
free(adapterAddresses);
return interfaces;
}
int main() {
std::vector<NetworkInterface> interfaces = getNetworkInterfaces();
for (const auto& iface : interfaces) {
std::cout << "Adapter Name: " << iface.adapterName << ", Description: " << iface.description
<< ", MAC: " << iface.macAddress << std::endl;
}
return 0;
}
- headers 포함
- #include <Windows.h> : Windows API 함수용
- #include <iphlpapi.h> : IP helper 함수용
- IP helper 라이브러리 링크
: #pragma comment(lib, "IPHLPAP.lib") : IP helper API 라이브러리 연결 - 네트워크 인터페이스 구조체 정의
: 네트워크 인터페이스의 어댑터 이름, 설명, MAC address를 저장하는 구조체 - getNetworkInterfaces 구현
- 초기 버퍼 크기
: 필요한 버퍼 크기를 결정하려면 어댑터 주소에 nullptr을 사용해 GetAdaptersAddresses를 호출한다. 필요한 크기는 buffersSize로 반환된다. - 버퍼 할당
: 어댑터 주소에 필요한 크기의 버퍼를 할당한다. - 어댑터 주소 검색
: 할당된 버퍼를 사용해 GetAdaptersAddresses를 다시 호출한다. 이 함수는 버퍼를 어댑터 정보로 채운다. - 데이터 추출 및 포맷
: 연결된 어댑터 목록을 반복하고, MAC address의 주소 형식을 지정하고, 정보를 NetworkInterface 구조의 벡터에 저장한다.
- 초기 버퍼 크기
- 정리
: 어댑터 주소에 할당된 메모리를 비운다 - Main 함수
: getNetworkInterfaces를 호출해 네트워크 인터페이스 리스트를 검색하고 세부 정보를 프린트한다.
참고
- https://learn.microsoft.com/en-us/windows/win32/api/iphlpapi/nf-iphlpapi-getadaptersaddresses
반응형
'기술(Tech, IT) > 네트워크 (Networking)' 카테고리의 다른 글
[Networking] Peer IP (0) | 2024.05.28 |
---|---|
[Networking] Network Interfaces Naming - Linux (0) | 2024.05.22 |
[Networking] GetIpAddrTable function (iphlpapi.h) (0) | 2024.05.16 |
[Networking] Loopback Address, Loopback Interface (0) | 2024.05.15 |
[Networking] SOM Ethernet (System-on-Module Ethernet) (0) | 2024.05.13 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- DICTIONARY
- ml
- 머신 러닝
- 소켓 프로그래밍
- leetcode
- vertex shader
- java
- C++
- Hash Map
- machine learning
- 딕셔너리
- The Economist
- 이코노미스트
- 리트코드
- 투 포인터
- defaultdict
- 파이썬
- I2C
- min heap
- join
- 안드로이드
- socket programming
- 티스토리챌린지
- tf-idf
- Android
- 이코노미스트 에스프레소
- Computer Graphics
- The Economist Espresso
- 오블완
- Python
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함
반응형