Как узнать маску подсети в windows

Подскажите пожалуйста, как можно узнать ip адрес своей подсети в windows при помощи c++? Я смог узнать свой ip таким образом

char ac[80];


    if (gethostname(ac, sizeof(ac)) == SOCKET_ERROR) {
        std::cerr << "Error " << WSAGetLastError() <<
                " when getting local host name." ;
        return 1;
    }

    struct hostent *phe = gethostbyname(ac); //получаем информацию о хосте по имени хоста

if (phe == 0) {
        std::cerr << "Yow! Bad host lookup." ;
        return 1;
    }

    for (int i = 0; phe->h_addr_list[i] != 0; ++i) {
        struct in_addr addr;
        memcpy(&addr, phe->h_addr_list[i], sizeof(struct in_addr));
        std::cout << "Address " << i << ": " << inet_ntoa(addr) << std::endl;
        
    }

В моем случае ip - 192.168.0.101. Как я понимаю мне нужно узнать маску подсети и на ее базе получить свой ip подсети - 192.168.0.1. В интернете прочитал, что нет api которое может вернуть маску подсети, как тогда можно ее узнать?


Ответы (2 шт):

Автор решения: gbg

Если прямо уж так хочется, в Qt есть нужный метод:

QHostAddress QNetworkAddressEntry::netmask() const

Returns the netmask associated with the IP address. The netmask is expressed in the form of an IP address, such as 255.255.0.0.

For IPv6 addresses, the prefix length is converted to an address where the number of bits set to 1 is equal to the prefix length. For a prefix length of 64 bits (the most common value), the netmask will be expressed as a QHostAddress holding the address FFFF:FFFF:FFFF:FFFF::

https://doc.qt.io/qt-5/qnetworkaddressentry.html#netmask

Не хотите зависимости от Qt - изучайте исходники чтобы понять, как она достает маску.

→ Ссылка
Автор решения: nick_n_a

На MSDN есть пример https://docs.microsoft.com/en-us/windows/win32/api/iphlpapi/nf-iphlpapi-getadaptersinfo

При желании их пример можно упростить.

По сути это вызов

IPHLPAPI_DLL_LINKAGE ULONG GetAdaptersInfo(
  PIP_ADAPTER_INFO AdapterInfo,
  PULONG           SizePointer
);

этой функции, а структура содержит маску.

→ Ссылка