3#include "adapter_info.h"
11#pragma comment(lib, "iphlpapi.lib")
12#pragma comment(lib, "ws2_32.lib")
14AdapterInfo::AdapterInfo() { QueryAdapterInfo(); }
16void AdapterInfo::QueryAdapterInfo() {
17 PIP_ADAPTER_INFO pAdapterInfo;
18 PIP_ADAPTER_INFO pAdapter = NULL;
21 ULONG ulOutBufLen =
sizeof(IP_ADAPTER_INFO);
22 pAdapterInfo = (IP_ADAPTER_INFO*)malloc(
sizeof(IP_ADAPTER_INFO));
23 if (pAdapterInfo == NULL) {
24 std::cerr <<
"Error allocating memory needed to call GetAdaptersinfo\n";
30 if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) {
32 pAdapterInfo = (IP_ADAPTER_INFO*)malloc(ulOutBufLen);
33 if (pAdapterInfo == NULL) {
34 std::cerr <<
"Error allocating memory needed to call GetAdaptersinfo\n";
39 if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR) {
40 pAdapter = pAdapterInfo;
42 if (pAdapter->GatewayList.IpAddress.String[0] !=
44 IPAddress = pAdapter->IpAddressList.IpAddress.String;
45 NetMask = pAdapter->IpAddressList.IpMask.String;
46 GateWay = pAdapter->GatewayList.IpAddress.String;
50 pAdapter = pAdapter->Next;
53 std::cerr <<
"GetAdaptersInfo failed with error: " << dwRetVal <<
"\n";
61std::string AdapterInfo::longToIp(
unsigned long ip) {
62 return std::to_string((ip >> 24) & 0xFF) +
"." +
63 std::to_string((ip >> 16) & 0xFF) +
"." +
64 std::to_string((ip >> 8) & 0xFF) +
"." + std::to_string(ip & 0xFF);
67unsigned long AdapterInfo::ipToLong(
const std::string& ip) {
68 unsigned long ipBytes[4] = {0};
69 int count = sscanf_s(ip.c_str(),
"%lu.%lu.%lu.%lu", &ipBytes[3], &ipBytes[2],
70 &ipBytes[1], &ipBytes[0]);
72 std::cerr <<
"Error parsing IP address." << std::endl;
75 return (ipBytes[3] << 24) | (ipBytes[2] << 16) | (ipBytes[1] << 8) |
79std::string AdapterInfo::CalculateBroadcastAddress(
const std::string& ip,
80 const std::string& netmask) {
81 unsigned long ipLong = ipToLong(ip);
82 unsigned long netmaskLong = ipToLong(netmask);
83 unsigned long wildcardMask = ~netmaskLong;
84 unsigned long broadcastAddress = ipLong | wildcardMask;
85 return longToIp(broadcastAddress);
88std::string AdapterInfo::GetBroadcastAddress() {
89 return CalculateBroadcastAddress(IPAddress, NetMask);
92std::string AdapterInfo::GetIPAddress() {
return IPAddress; }
94std::string AdapterInfo::GetNetMask() {
return NetMask; }
96std::string AdapterInfo::GetGateWay() {
return GateWay; }