本文中, 我们来看看如何利用GetAdaptersInfo获取与网卡相关的一些信息。 如果你在运行的时候缺头文件或者库, 请到网上下载, 也可以直接在我的博客资源中下载, 免积分。其实, 这个函数中的Adapter就是指网卡。
好, 上代码(为了简便,不考虑各种异常):
#include <stdio.h>
#include <winsock2.h>
#include <iphlpapi.h> // 如果没有这个, 请在我的博客资源中下载
#pragma comment(lib, "iphlpapi.lib")
int main()
{
unsigned long len = sizeof(IP_ADAPTER_INFO);
IP_ADAPTER_INFO *pAdapterInfo = (IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO));
GetAdaptersInfo(pAdapterInfo, &len); // 获取链表指针值的关键函数
PIP_ADAPTER_INFO pAdapter = pAdapterInfo;
while(pAdapter) // 遍历链表
{
printf("NIC: %s\n", pAdapter->AdapterName);
printf("NIC info: %s\n", pAdapter->Description);
printf("\n");
printf("MAC: ");
unsigned int i = 0; // 不用int, 是为了去掉编译warning
for(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]);
}
}
printf("IP: %s\n", pAdapter->IpAddressList.IpAddress.String);
printf("Mask: %s\n", pAdapter->IpAddressList.IpMask.String);
printf("Gateway: %s\n", pAdapter->GatewayList.IpAddress.String);
printf("\n");
if(pAdapter->DhcpEnabled)
{
printf("DHCP: YES\n");
printf("DHCP Server: %s\n", pAdapter->DhcpServer.IpAddress.String);
}
else
{
printf("DHCP: NO\n");
}
pAdapter = pAdapter->Next; // 下一个网卡
}
free(pAdapterInfo);
printf("\n");
return 0;
}
结果是(我用xx代替了部分信息):
NIC: {xxxxxxxxxxx-xxxx-xxxxx-xxxx-xxxxxxxxxxxx}
NIC info: Dell Wireless 1395 WLAN Mini-Card - 数据包计划程序微型端口
MAC: xx:xx:xx:xx:xx:xx
IP: 192.168.1.100
Mask: 255.255.255.0
Gateway: 192.168.1.1
DHCP: YES
DHCP Server: 192.168.1.1
如果把我PC的无线网络关闭, 那又是另外一种结果, 有兴趣的朋友赶紧试试吧。
备注: 上面的网卡是正在运行的网卡, 而不是所有的网卡。