본문 바로가기
프로그래밍

👨‍💻 [MFC] MFC 에서 네트워크 정보를 얻어오는 GetAdaptersAddresses 를 이용한 예제는 어떻게 되나요?

by 밝음의기둥 2024. 10. 21.
반응형

👨‍💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.

MFC 에서 현재 PC의 네트워크 정보를 알아야 하는 상황이 생겨서, 네트워크 정보를 얻어오는 GetAdaptersAddresses 를 이용한 예제에 대해서 알아보았습니다..


질문 >

MFC 에서 GetAdaptersAddresses 를 이용한 예제는 어떻게 되나요?

답변 >

GetAdaptersAddresses 함수는 GetAdaptersInfo 함수보다 더 강력하고 유연한 네트워크 어댑터 정보 검색 기능을 제공합니다. GetAdaptersAddresses는 IPv6 주소를 지원하고, 추가적인 네트워크 정보를 제공합니다. 다음은 MFC에서 GetAdaptersAddresses를 사용하여 네트워크 어댑터 정보를 가져오는 예제입니다.

  1. 필요한 헤더 파일 포함:
#include <afxwin.h>
#include <iphlpapi.h>
#include <vector>
#pragma comment(lib, "iphlpapi.lib")

  1. 네트워크 어댑터 정보를 가져오는 함수 작성:
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;
}

  1. 네트워크 어댑터 정보를 출력하는 함수 작성:
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);
    }
}

  1. 응용 프로그램에서 함수 호출: MFC 애플리케이션의 적절한 위치 (예: 버튼 클릭 이벤트 핸들러)에서 PrintNetworkAdapters 함수를 호출합니다.
void CMyAppDlg::OnBnClickedButtonGetNetworkInfo() {
    PrintNetworkAdapters();
}

이 코드는 MFC 애플리케이션에서 GetAdaptersAddresses 함수를 사용하여 네트워크 어댑터 정보를 가져와 출력하는 예제입니다. GetAdaptersAddresses는 IPv4 및 IPv6 주소 모두를 지원하며, 네트워크 어댑터에 대한 상세한 정보를 제공합니다. inet_ntop 함수는 네트워크 주소를 문자열 형식으로 변환하는 데 사용됩니다.


🎬 유튜브 채널 🎬

 

위로그@WiLog

📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리 입니다. 📢 위로그@WiLog 는 자기주도학습을 목적으로 라이브 스트리밍을 합니다. 📢 1인 게임 개발을 목표로 Unreal과 Blender를 학습 중입니

www.youtube.com

 

🎬 치지직 채널 🎬

 

위로그 채널 - CHZZK

지금, 스트리밍이 시작됩니다. 치지직-

chzzk.naver.com

 


반응형