1#include "AdapterInfo.h"
8#pragma comment(lib, "iphlpapi.lib")
9#pragma comment(lib, "ws2_32.lib")
11AdapterInfo::AdapterInfo() { QueryAdapterInfo(); }
13void AdapterInfo::QueryAdapterInfo() {
14 PIP_ADAPTER_INFO pAdapterInfo;
15 PIP_ADAPTER_INFO pAdapter = NULL;
18 ULONG ulOutBufLen =
sizeof(IP_ADAPTER_INFO);
19 pAdapterInfo = (IP_ADAPTER_INFO*)malloc(
sizeof(IP_ADAPTER_INFO));
20 if (pAdapterInfo == NULL) {
21 std::cerr <<
"Error allocating memory needed to call GetAdaptersinfo\n";
27 if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) {
29 pAdapterInfo = (IP_ADAPTER_INFO*)malloc(ulOutBufLen);
30 if (pAdapterInfo == NULL) {
31 std::cerr <<
"Error allocating memory needed to call GetAdaptersinfo\n";
36 if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR) {
37 pAdapter = pAdapterInfo;
39 if (pAdapter->GatewayList.IpAddress.String[0] !=
41 IPAddress = pAdapter->IpAddressList.IpAddress.String;
42 NetMask = pAdapter->IpAddressList.IpMask.String;
43 GateWay = pAdapter->GatewayList.IpAddress.String;
47 pAdapter = pAdapter->Next;
50 std::cerr <<
"GetAdaptersInfo failed with error: " << dwRetVal <<
"\n";
58std::string AdapterInfo::longToIp(
unsigned long ip) {
59 return std::to_string((ip >> 24) & 0xFF) +
"." +
60 std::to_string((ip >> 16) & 0xFF) +
"." +
61 std::to_string((ip >> 8) & 0xFF) +
"." + std::to_string(ip & 0xFF);
64unsigned long AdapterInfo::ipToLong(
const std::string& ip) {
65 unsigned long ipBytes[4] = {0};
66 int count = sscanf_s(ip.c_str(),
"%lu.%lu.%lu.%lu", &ipBytes[3], &ipBytes[2],
67 &ipBytes[1], &ipBytes[0]);
69 std::cerr <<
"Error parsing IP address." << std::endl;
72 return (ipBytes[3] << 24) | (ipBytes[2] << 16) | (ipBytes[1] << 8) |
76std::string AdapterInfo::CalculateBroadcastAddress(
const std::string& ip,
77 const std::string& netmask) {
78 unsigned long ipLong = ipToLong(ip);
79 unsigned long netmaskLong = ipToLong(netmask);
80 unsigned long wildcardMask = ~netmaskLong;
81 unsigned long broadcastAddress = ipLong | wildcardMask;
82 return longToIp(broadcastAddress);
85std::string AdapterInfo::GetBroadcastAddress() {
86 return CalculateBroadcastAddress(IPAddress, NetMask);
89std::string AdapterInfo::GetIPAddress() {
return IPAddress; }
91std::string AdapterInfo::GetNetMask() {
return NetMask; }
93std::string AdapterInfo::GetGateWay() {
return GateWay; }