반응형
👨💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.
MFC 에서 현재 PC의 네트워크 정보를 알아야 하는 상황이 생겨서, 네트워크 정보를 얻어오는 방법 중 IP_ADAPTER_ADDRESSES 에서 getway 주소를 얻는 방법에 대해서 알아보았습니다..
질문 >
MFC 에서 IP_ADAPTER_ADDRESSES 에서 getway 주소를 얻으려면 어떻게 해야 하나요?
답변 >
IP_ADAPTER_ADDRESSES 구조체에서 게이트웨이 주소를 얻으려면 FirstGatewayAddress 멤버를 사용해야 합니다. 이 멤버는 IP_ADAPTER_GATEWAY_ADDRESS_LH 구조체의 링크드 리스트를 가리킵니다. 이 구조체의 Address 멤버는 SOCKADDR 구조체를 가리키며, 이를 통해 게이트웨이 주소를 추출할 수 있습니다.
다음은 MFC 애플리케이션에서 GetAdaptersAddresses를 사용하여 네트워크 어댑터 정보를 가져오고, 게이트웨이 주소를 출력하는 예제입니다.
- 필요한 헤더 파일 포함:
#include <afxwin.h>
#include <iphlpapi.h>
#include <vector>
#include <ws2tcpip.h>
#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")
- 네트워크 어댑터 정보를 가져오는 함수 작성:
std::vector<PIP_ADAPTER_ADDRESSES> GetNetworkAdapters() {
std::vector<PIP_ADAPTER_ADDRESSES> adapters;
ULONG outBufLen = 0;
ULONG flags = GAA_FLAG_INCLUDE_GATEWAYS;
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;
}
- IP 주소와 게이트웨이 주소를 출력하는 함수 작성:
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;
}
// 게이트웨이 주소 출력
PIP_ADAPTER_GATEWAY_ADDRESS_LH pGateway = adapter->FirstGatewayAddress;
while (pGateway != nullptr) {
SOCKADDR *sa = pGateway->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("Gateway Address: %s\\n"), CString(buf));
pGateway = pGateway->Next;
}
AfxMessageBox(msg);
}
// 메모리 해제
for (auto& adapter : adapters) {
free(adapter);
}
}
- 응용 프로그램에서 함수 호출: MFC 애플리케이션의 적절한 위치 (예: 버튼 클릭 이벤트 핸들러)에서 PrintNetworkAdapters 함수를 호출합니다.
void CMyAppDlg::OnBnClickedButtonGetNetworkInfo() {
PrintNetworkAdapters();
}
이 코드는 MFC 애플리케이션에서 GetAdaptersAddresses 함수를 사용하여 네트워크 어댑터 정보를 가져오고, 각 어댑터의 IP 주소와 게이트웨이 주소를 출력하는 예제입니다. inet_ntop 함수를 사용하여 SOCKADDR 구조체의 주소를 문자열 형식으로 변환하고, 이를 메시지 박스를 통해 출력합니다.
🎬 유튜브 채널 🎬
👉 https://www.youtube.com/channel/UCaY1IKFIwyRrj65DCOxB8_g
🎬 치지직 채널 🎬
👉 https://chzzk.naver.com/f147043b22c5c0a621cf325bb75f8460
반응형
'프로그래밍' 카테고리의 다른 글
👨💻 [MFC] MFC 에서 이미지(Image)를 처리하려면 어떻게 해야 하나요? (1) | 2024.10.21 |
---|---|
👨💻 [MFC] MFC 에서 IP_ADAPTER_ADDRESSES 에서 netmask 주소를 얻으려면 어떻게 해야 하나요? (0) | 2024.10.21 |
👨💻 [MFC] MFC 에서 IP_ADAPTER_ADDRESSES 에서 IP 주소를 얻으려면 어떻게 해야 하나요? (0) | 2024.10.21 |
👨💻 [MFC] MFC 에서 네트워크 정보를 얻어오는 GetAdaptersAddresses 를 이용한 예제는 어떻게 되나요? (0) | 2024.10.21 |
👨💻 [MFC] MFC 에서 네트워크 정보를 얻어오려면 어떻게 해야 하나요? (0) | 2024.10.21 |