OpenCPN Partial API docs
Loading...
Searching...
No Matches
AdapterInfo.cpp
1#include "AdapterInfo.h"
2#include <iostream>
3#include <winsock2.h>
4#include <iphlpapi.h>
5#include <stdlib.h>
6#include <stdio.h>
7
8#pragma comment(lib, "iphlpapi.lib")
9#pragma comment(lib, "ws2_32.lib")
10
11AdapterInfo::AdapterInfo() { QueryAdapterInfo(); }
12
13void AdapterInfo::QueryAdapterInfo() {
14 PIP_ADAPTER_INFO pAdapterInfo;
15 PIP_ADAPTER_INFO pAdapter = NULL;
16 DWORD dwRetVal = 0;
17
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";
22 return;
23 }
24
25 // Make an initial call to GetAdaptersInfo to get the necessary size into
26 // ulOutBufLen
27 if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) {
28 free(pAdapterInfo);
29 pAdapterInfo = (IP_ADAPTER_INFO*)malloc(ulOutBufLen);
30 if (pAdapterInfo == NULL) {
31 std::cerr << "Error allocating memory needed to call GetAdaptersinfo\n";
32 return;
33 }
34 }
35
36 if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR) {
37 pAdapter = pAdapterInfo;
38 while (pAdapter) {
39 if (pAdapter->GatewayList.IpAddress.String[0] !=
40 '0') { // Check if gateway is defined
41 IPAddress = pAdapter->IpAddressList.IpAddress.String;
42 NetMask = pAdapter->IpAddressList.IpMask.String;
43 GateWay = pAdapter->GatewayList.IpAddress.String;
44 break;
45 }
46
47 pAdapter = pAdapter->Next;
48 }
49 } else {
50 std::cerr << "GetAdaptersInfo failed with error: " << dwRetVal << "\n";
51 }
52
53 if (pAdapterInfo) {
54 free(pAdapterInfo);
55 }
56}
57
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);
62}
63
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]);
68 if (count != 4) {
69 std::cerr << "Error parsing IP address." << std::endl;
70 return 0;
71 }
72 return (ipBytes[3] << 24) | (ipBytes[2] << 16) | (ipBytes[1] << 8) |
73 ipBytes[0];
74}
75
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);
83}
84
85std::string AdapterInfo::GetBroadcastAddress() {
86 return CalculateBroadcastAddress(IPAddress, NetMask);
87}
88
89std::string AdapterInfo::GetIPAddress() { return IPAddress; }
90
91std::string AdapterInfo::GetNetMask() { return NetMask; }
92
93std::string AdapterInfo::GetGateWay() { return GateWay; }