/* 获取本地ip地址,子网掩码,默认网关,mac地址,网络适配器信息,hostname,域名 dns,网络接口信息 */#include<WinSock2.h>#include<IPHlpApi.h>#include<stdio.h> #pragma comment(lib,"ws2_32.lib") #pragma comment(lib,"iphlpapi.lib") voidmain() { /*typedef struct _IP_ADAPTER_INFO { struct _IP_ADAPTER_INFO* Next; DWORD ComboIndex; char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4]; char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4]; UINT AddressLength; BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH]; DWORD Index; UINT Type; UINT DhcpEnabled; PIP_ADDR_STRING CurrentIpAddress; IP_ADDR_STRING IpAddressList; IP_ADDR_STRING GatewayList; IP_ADDR_STRING DhcpServer; BOOL HaveWins; IP_ADDR_STRING PrimaryWinsServer; IP_ADDR_STRING SecondaryWinsServer; time_t LeaseObtained; time_t LeaseExpires; } IP_ADAPTER_INFO, *PIP_ADAPTER_INFO; */IP_ADAPTER_INFO*pAdapterInfo; PIP_ADAPTER_INFO pAdapter; ULONG bufferLength; DWORD status; pAdapterInfo = (IP_ADAPTER_INFO*)malloc(sizeof(IP_ADAPTER_INFO)); bufferLength = sizeof(IP_ADAPTER_INFO); //根据该函数先故意失败获取,得到链表真正大小 if (GetAdaptersInfo(pAdapterInfo, &bufferLength)!=ERROR_SUCCESS) { free(pAdapterInfo); pAdapterInfo = (IP_ADAPTER_INFO*)malloc(bufferLength); } //获取网卡信息结构体第一个节点. if (GetAdaptersInfo(pAdapterInfo, &bufferLength) !=ERROR_SUCCESS) { printf("error "); } //因为网卡之间链接成一个单链表,通过一个指针遍历该链表 pAdapter =pAdapterInfo; while(pAdapter) { printf("网卡名: %s ", pAdapter->AdapterName); printf("网卡描述: %s ", pAdapter->Description); printf("网卡MAC地址: "); for (int i = 0; i < pAdapter->AddressLength; i++) { if (i == (pAdapter->AddressLength - 1)) printf("%.2x ", (int)pAdapter->Address[i]); elseprintf("%.2x-", (int)pAdapter->Address[i]); } printf("ip地址: %s ", pAdapter->IpAddressList.IpAddress.String); printf("子网掩码: %s ", pAdapter->IpAddressList.IpMask.String); printf("网关: %s ", pAdapter->GatewayList.IpAddress.String); if (pAdapter->DhcpEnabled) { printf("启用DHCP: 是 "); printf("DHCP服务器地址: %s ", pAdapter->DhcpServer.IpAddress.String); } else{ printf("启用DHCP: 否 "); } pAdapter = pAdapter->Next; } if(pAdapterInfo) free(pAdapterInfo); getchar(); }
获取dns相关信息:
#include<WinSock2.h>#include<IPHlpApi.h>#include<stdio.h> #pragma comment(lib,"ws2_32.lib") #pragma comment(lib,"iphlpapi.lib") voidmain() { ULONG bufferLength; DWORD status; FIXED_INFO*fixedInfo; IP_ADDR_STRING*pIpAddr; /*typedef struct { char HostName[MAX_HOSTNAME_LEN + 4] ; char DomainName[MAX_DOMAIN_NAME_LEN + 4]; PIP_ADDR_STRING CurrentDnsServer; IP_ADDR_STRING DnsServerList; UINT NodeType; char ScopeId[MAX_SCOPE_ID_LEN + 4]; UINT EnableRouting; UINT EnableProxy; UINT EnableDns; } FIXED_INFO_W2KSP1, *PFIXED_INFO_W2KSP1; */ fixedInfo = (FIXED_INFO*)GlobalAlloc(GPTR, sizeof(FIXED_INFO)); bufferLength = sizeof(FIXED_INFO); if (ERROR_BUFFER_OVERFLOW == GetNetworkParams(fixedInfo, &bufferLength)) { GlobalFree(fixedInfo); fixedInfo = (FIXED_INFO*)GlobalAlloc(GPTR, sizeof(FIXED_INFO)); } if (GetNetworkParams(fixedInfo, &bufferLength) !=ERROR_SUCCESS) { printf("error "); } else{ printf("主机名: %s ", fixedInfo->HostName); printf("域名: %s ", fixedInfo->HostName); char*nodeType; switch (fixedInfo->NodeType) { caseBROADCAST_NODETYPE: nodeType = "broadcase node"; break; casePEER_TO_PEER_NODETYPE: nodeType = "peertopeer node"; break; caseMIXED_NODETYPE: nodeType = "mixed node"; break; caseHYBRID_NODETYPE: nodeType = "hybrid node"; break; default: nodeType = "unkowntype node"; break; } printf("节点类型 %d - %s ", fixedInfo->NodeType, nodeType); printf("是否启用路由功能 %s ", fixedInfo->EnableRouting ? "是" : "否"); printf("是否启用arp代理功能 %s ", fixedInfo->EnableProxy ? "是" : "否"); printf("是否启用dns服务器 %s ", fixedInfo->EnableDns ? "是" : "否"); printf("dns服务器列表 "); printf("%s ", fixedInfo->DnsServerList.IpAddress.String); pIpAddr = fixedInfo->DnsServerList.Next; while(pIpAddr) { printf("%s ", pIpAddr->IpAddress.String); pIpAddr = pIpAddr->Next; } } getchar(); }
获取网络接口数量API:GetNumberOfInterfaces(pdwNumIf)