반응형
👨💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.
MFC 에서 현재 PC의 네트워크 정보를 알아야 하는 상황이 생겨서, 네트워크 정보를 얻어오는 GetAdaptersAddresses 를 이용한 예제에 대해서 알아보았습니다..
질문 >
MFC 에서 GetAdaptersAddresses 를 이용한 예제는 어떻게 되나요?
답변 >
GetAdaptersAddresses 함수는 GetAdaptersInfo 함수보다 더 강력하고 유연한 네트워크 어댑터 정보 검색 기능을 제공합니다. GetAdaptersAddresses는 IPv6 주소를 지원하고, 추가적인 네트워크 정보를 제공합니다. 다음은 MFC에서 GetAdaptersAddresses를 사용하여 네트워크 어댑터 정보를 가져오는 예제입니다.
- 필요한 헤더 파일 포함:
#include <afxwin.h>
#include <iphlpapi.h>
#include <vector>
#pragma comment(lib, "iphlpapi.lib")
- 네트워크 어댑터 정보를 가져오는 함수 작성:
std::vector<PIP_ADAPTER_ADDRESSES> GetNetworkAdapters() {
std::vector<PIP_ADAPTER_ADDRESSES> adapters;
ULONG outBufLen = 0;
ULONG flags = GAA_FLAG_INCLUDE_PREFIX;
ULONG family = AF_UNSPEC; // For both IPv4 and IPv6 addresses
GetAdaptersAddresses(family, flags, NULL, NULL, &outBufLen);
PIP_ADAPTER_ADDRESSES pAdapterAddresses = (PIP_ADAPTER_ADDRESSES)malloc(outBufLen);
if (pAdapterAddresses == nullptr) {
AfxMessageBox(_T("Error allocating memory needed to call GetAdaptersAddresses"));
return adapters;
}
if (GetAdaptersAddresses(family, flags, NULL, pAdapterAddresses, &outBufLen) == NO_ERROR) {
PIP_ADAPTER_ADDRESSES pAdapter = pAdapterAddresses;
while (pAdapter) {
adapters.push_back(pAdapter);
pAdapter = pAdapter->Next;
}
} else {
AfxMessageBox(_T("GetAdaptersAddresses failed"));
}
return adapters;
}
- 네트워크 어댑터 정보를 출력하는 함수 작성:
void PrintNetworkAdapters() {
auto adapters = GetNetworkAdapters();
for (const auto& adapter : adapters) {
CString msg;
msg.Format(_T("Adapter Name: %s\\nDescription: %s\\n"),
adapter->AdapterName,
adapter->Description);
// IP 주소 출력
PIP_ADAPTER_UNICAST_ADDRESS pUnicast = adapter->FirstUnicastAddress;
while (pUnicast != nullptr) {
SOCKADDR *sa = pUnicast->Address.lpSockaddr;
char buf[INET6_ADDRSTRLEN] = { 0 };
if (sa->sa_family == AF_INET) {
sockaddr_in *sa_in = (sockaddr_in *)sa;
inet_ntop(AF_INET, &(sa_in->sin_addr), buf, INET6_ADDRSTRLEN);
} else if (sa->sa_family == AF_INET6) {
sockaddr_in6 *sa_in6 = (sockaddr_in6 *)sa;
inet_ntop(AF_INET6, &(sa_in6->sin6_addr), buf, INET6_ADDRSTRLEN);
}
msg.AppendFormat(_T("IP Address: %s\\n"), CString(buf));
pUnicast = pUnicast->Next;
}
AfxMessageBox(msg);
}
// 메모리 해제
for (auto& adapter : adapters) {
free(adapter);
}
}
- 응용 프로그램에서 함수 호출: MFC 애플리케이션의 적절한 위치 (예: 버튼 클릭 이벤트 핸들러)에서 PrintNetworkAdapters 함수를 호출합니다.
void CMyAppDlg::OnBnClickedButtonGetNetworkInfo() {
PrintNetworkAdapters();
}
이 코드는 MFC 애플리케이션에서 GetAdaptersAddresses 함수를 사용하여 네트워크 어댑터 정보를 가져와 출력하는 예제입니다. GetAdaptersAddresses는 IPv4 및 IPv6 주소 모두를 지원하며, 네트워크 어댑터에 대한 상세한 정보를 제공합니다. inet_ntop 함수는 네트워크 주소를 문자열 형식으로 변환하는 데 사용됩니다.
🎬 유튜브 채널 🎬
🎬 치지직 채널 🎬
반응형