* time_t LeaseObtained; // 当前的DHCP租借获取的时间,只有在启用DHCP时生效
* time_t LeaseExpires; // 当前的DHCP租借失败的时间,只有在启用DHCP时生效
* } IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;
typedef struct _IP_ADDR_STRING { //存储一个IP地址和其相应的子网掩码,同时作为点分十进制的字符串
struct _IP_ADDR_STRING* Next; //由于一个网卡可能有多个IP,故为链表结构
IP_ADDRESS_STRING IpAddress;
IP_MASK_STRING IpMask;
DWORD Context;
} IP_ADDR_STRING, *PIP_ADDR_STRING;
typedef struct { //存储一个IP地址,同时作为点分十进制的字符串
char String[4 * 4];
} IP_ADDRESS_STRING, *PIP_ADDRESS_STRING, IP_MASK_STRING, *PIP_MASK_STRING;
**/
//一台机器上可能不止有一个网卡,但每一个网卡只有一个MAC地址,而每一个网卡可能配置多个IP地址;如平常的笔记本电脑中,就会有无线网卡和有线网卡两种;因此,如果要获得本机所有网卡的IP和MAC地址信息,则必须顺序获得每个网卡,再依次获取其信息;
int GetAdaptersInfoFunction() // 获取本地网络适配器信息的函数
{
// 变量声明
IP_ADAPTER_INFO *pAdapterInfo; // 指定获取到的网络信息结构体链表的指针
ULONG ulOutBufLen; // 获取到网络信息结构体链表的长度
DWORD dwRetVal; // 返回调用编码
// 获取本地网络适配器的信息
// 为pAdapterINfo分配空间
pAdapterInfo = (IP_ADAPTER_INFO *) malloc(sizeof(IP_ADAPTER_INFO));
ulOutBufLen = sizeof(IP_ADAPTER_INFO);
// 需要两次调用GetAdaptersInfo()函数
// 第1次调用GetAdaptersInfo(), 获取返回结果的大小保存到ulOutBufLen中
// 因为网络信息结构体链表的默认长度是不知道的
if(ERROR_SUCCESS != GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) ){
free(pAdapterInfo);
pAdapterInfo = (IP_ADAPTER_INFO *)malloc(ulOutBufLen);
}
// 第2次调用GetAdaptersInfo(), 获取本地网络信息保存到结构体pAdapterInfo中
if(ERROR_SUCCESS != (dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen))){
printf("GetAdaptersInfo Error! &d\n", dwRetVal);
exit(1);
}
// 显示本地网络适配器信息,从pAdapterInfo获取并显示本地网络信息
PIP_ADAPTER_INFO pAdapter;
pAdapter = pAdapterInfo;
while(pAdapter){
printf("网络适配器名: \t\t%s\n", pAdapter->AdapterName);
printf("网络适配器描述: \t%s\n\n", pAdapter->Description);
printf("MAC地址:\t\t");
// 处理MAC地址
for(unsigned int i = 0; i < pAdapter->AddressLength; ++i){
if(i == (pAdapter->AddressLength -1 ) ){ // 最后一次输入换行
printf("%.2x\n", (int)pAdapter->Address[i]);
}
else{
printf("%.2X-", (int)pAdapter->Address[i]);//x十六进制(x:会是a,b,c,d,e;X:会是A,B,C,D,E)
}
}
printf("IP地址: \t\t%s\n", pAdapter->IpAddressList.IpAddress.String);
printf("子网掩码: \t\t%s\n", pAdapter->IpAddressList.IpMask.String);
printf("网关: \t\t\t%s\n", pAdapter->GatewayList.IpAddress.String);
printf("---------------\n");
if(pAdapter -> DhcpEnabled){ // 指定该网络适配器上是否启用了DHCP(动态主机配置协议)
printf("启用DHCP: \t\t是\n");
printf("DHCP服务器: \t\t%s\n", pAdapter->DhcpServer.IpAddress.String);
}
else{
printf("启用DHCP: \t\t否\n");
}
// 处理下一个网络适配器
pAdapter = pAdapter -> Next;
if(pAdapter){
printf("\n\n**************************************************************\n");
}
}
// 释放资源
if(pAdapterInfo){
free(pAdapterInfo);
}
printf("\n\n");