Как узнать маску подсети в 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 шт):
Если прямо уж так хочется, в 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 - изучайте исходники чтобы понять, как она достает маску.
На 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
);
этой функции, а структура содержит маску.