Учитывая адрес IPv4, как я могу получить связанное с ним имя сетевого интерфейса, например «Подключение по локальной сети адаптера Ethernet», в Windows с использованием С++? В качестве альтернативы, как я могу получить список имен сетевых интерфейсов и адресов IPv4 для локального компьютера? Я могу получить только адреса IPv4, используя getaddrinfo
и inet_ntoa
.
Получить имя сетевого интерфейса из адреса IPv4
comment
Это зависит от платформы. Например, вы должны использовать GetAdaptersInfo в Windows.
- person mattn   schedule 25.06.2013
comment
@mattn В документации для GetAdaptersInfo говорится об использовании GetAdaptersAddresses в XP и более поздних версиях. Это предпочтительно?
- person 1''   schedule 25.06.2013
comment
Да, лучше использовать GetAdaptersAddresses, если вы хотите, чтобы он работал на XP или более поздних версиях.
- person mattn   schedule 25.06.2013
comment
Кажется, это работает gist.github.com/yoggy/1241986
- person mattn   schedule 25.06.2013
Ответы (2)
#include <windows.h>
#include <iphlpapi.h>
#include <stdio.h>
#pragma comment(lib, "iphlpapi.lib")
int
main(int argc, char** argv) {
PIP_ADAPTER_INFO pAdapterInfo;
pAdapterInfo = (IP_ADAPTER_INFO *) malloc(sizeof(IP_ADAPTER_INFO));
ULONG buflen = sizeof(IP_ADAPTER_INFO);
if(GetAdaptersInfo(pAdapterInfo, &buflen) == ERROR_BUFFER_OVERFLOW) {
free(pAdapterInfo);
pAdapterInfo = (IP_ADAPTER_INFO *) malloc(buflen);
}
if(GetAdaptersInfo(pAdapterInfo, &buflen) == NO_ERROR) {
PIP_ADAPTER_INFO pAdapter = pAdapterInfo;
while (pAdapter) {
printf("\tAdapter Name: \t%s\n", pAdapter->AdapterName);
printf("\tAdapter Desc: \t%s\n", pAdapter->Description);
printf("\tAdapter Addr: \t%ld\n", pAdapter->Address);
printf("\tIP Address: \t%s\n", pAdapter->IpAddressList.IpAddress.String);
printf("\tIP Mask: \t%s\n", pAdapter->IpAddressList.IpMask.String);
printf("\tGateway: \t%s\n", pAdapter->GatewayList.IpAddress.String);
if(pAdapter->DhcpEnabled) {
printf("\tDHCP Enabled: Yes\n");
printf("\t\tDHCP Server: \t%s\n", pAdapter->DhcpServer.IpAddress.String);
printf("\tLease Obtained: %ld\n", pAdapter->LeaseObtained);
} else {
printf("\tDHCP Enabled: No\n");
}
if(pAdapter->HaveWins) {
printf("\tHave Wins: Yes\n");
printf("\t\tPrimary Wins Server: \t%s\n", pAdapter->PrimaryWinsServer.IpAddress.String);
printf("\t\tSecondary Wins Server: \t%s\n", pAdapter->SecondaryWinsServer.IpAddress.String);
} else {
printf("\tHave Wins: No\n");
}
pAdapter = pAdapter->Next;
}
} else {
printf("Call to GetAdaptersInfo failed.\n");
}
}
Как упомянул @sonyisda1, это взято из MSDN.
person
mattn
schedule
25.06.2013
Вероятно, следует упомянуть, что это взято из MSDN и если вы используете WinXP или более позднюю версию, вместо этого следует использовать
GetAdaptersAddresses
- person sonyisda1; 27.06.2019
Я также поделюсь своей минимальной версией:
#include <windows.h>
#include <iphlpapi.h>
#include <stdio.h>
#pragma comment(lib, "iphlpapi.lib")
int main() {
ULONG buflen = sizeof(IP_ADAPTER_INFO);
IP_ADAPTER_INFO *pAdapterInfo = (IP_ADAPTER_INFO *)malloc(buflen);
if (GetAdaptersInfo(pAdapterInfo, &buflen) == ERROR_BUFFER_OVERFLOW) {
free(pAdapterInfo);
pAdapterInfo = (IP_ADAPTER_INFO *)malloc(buflen);
}
if (GetAdaptersInfo(pAdapterInfo, &buflen) == NO_ERROR) {
for (IP_ADAPTER_INFO *pAdapter = pAdapterInfo; pAdapter; pAdapter = pAdapter->Next) {
printf("%s (%s)\n", pAdapter->IpAddressList.IpAddress.String, pAdapter->Description);
}
}
if (pAdapterInfo) free(pAdapterInfo);
return 0;
}
person
1''
schedule
25.06.2013
это полезно
- person iamrameshkumar; 09.11.2018