使用GetAdaptersInfo管理网卡
GetAdaptersInfo函数返回与系统关联的IP地址信息,填充一个IP_ADAPTER_INFO结构指针。
使用GetAdaptersInfo函数
1.声明一个IP_ADAPTER_INFO结构指针变量pAdapterInfo,一个ULONG变量ulOutBufLen。这些变量作为参数传递给GetAdaptersInfo函数。定义一个DWORD变量dwRetVal(用于检错)。
IP_ADAPTER_INFO *pAdapterInfo;
ULONG ulOutBufLen;
DWORD dwRetVal;
2.为结构分配内存。
pAdapterInfo = (IP_ADAPTER_INFO *) malloc( sizeof(IP_ADAPTER_INFO) );
ulOutBufLen = sizeof(IP_ADAPTER_INFO);
3.第一次调用GetAdaptersInfo获取适当的ulOutBufLen变量大小。
注:有意进行一次失败调用,以确定适当的ulOutBufLen变量(缓冲区)大小,以缓冲返回至pAdapterInfo的所有数据。这种方法是此类结构和函数的常用编程模式。
if (GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) != ERROR_SUCCESS)
{
free (pAdapterInfo);
pAdapterInfo = (IP_ADAPTER_INFO *) malloc ( ulOutBufLen );
}
4.进行第二次GetAdaptersInfo调用,传递pAdapterInfo、ulOutBufLen参数并进行一般的错误检查。错误信息返回至dwRetVal(用于更多的错误检查)。
if ((dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen)) != ERROR_SUCCESS)
{
printf("GetAdaptersInfo call failed with %d/n", dwRetVal);
}
5.如果调用成功,通过pAdapterInfo结构访问数据。
PIP_ADAPTER_INFO pAdapter = pAdapterInfo;
while (pAdapter)
{
printf("Adapter Name: %s/n", pAdapter->AdapterName);
printf("Adapter Desc: %s/n", pAdapter->Description);
printf("/tAdapter Addr: /t");
for (UINT 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 Address: %s/n", pAdapter->IpAddressList.IpAddress.String);
printf("IP Mask: %s/n", pAdapter->IpAddressList.IpMask.String);
printf("/tGateway: /t%s/n", pAdapter->GatewayList.IpAddress.String);
printf("/t***/n");
if (pAdapter->DhcpEnabled)
{
printf("/tDHCP Enabled: Yes/n");
printf("/t/tDHCP Server: /t%s/n", pAdapter->DhcpServer.IpAddress.String);
}
else
printf("/tDHCP Enabled: No/n");
pAdapter = pAdapter->Next;
}
6. 释放为pFixedInfo结构分配的内存。
if (pAdapterInfo)
free(pAdapterInfo);
//调用GetAdaptersInfo示例代码:修改自MSDN,这个是普通调用,而网络中的资料使用指针调用。
//在vc++2008下编译通过。/花指令 点。点。记事本
#pragma comment(lib, "IPHLPAPI.lib")
#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
int main()
{
IP_ADAPTER_INFO *pAdapterInfo;
ULONG ulOutBufLen;
DWORD dwRetVal;
PIP_ADAPTER_INFO pAdapter;
UINT i ;
pAdapterInfo = (IP_ADAPTER_INFO *) malloc( sizeof(IP_ADAPTER_INFO) );
ulOutBufLen = sizeof(IP_ADAPTER_INFO);
if (GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) != ERROR_SUCCESS) {
free (pAdapterInfo);
pAdapterInfo = (IP_ADAPTER_INFO *) malloc ( ulOutBufLen );
}
if ((dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen)) != ERROR_SUCCESS) {
printf("GetAdaptersInfo call failed with %d/n", dwRetVal);
}
pAdapter = pAdapterInfo;
while (pAdapter) {
printf("Adapter Name: %s/n", pAdapter->AdapterName);
printf("Adapter Desc: %s/n", pAdapter->Description);
printf("/tAdapter Addr: /t");
for (i = 0; i < pAdapter->AddressLength; i++)
{
if (i == (pAdapter->AddressLength - 1))
printf("%.2X/n",(int)pAdapter->Address);
else
printf("%.2X-",(int)pAdapter->Address);
}
printf("IP Address: %s/n", pAdapter->IpAddressList.IpAddress.String);
printf("IP Mask: %s/n", pAdapter->IpAddressList.IpMask.String);
printf("/tGateway: /t%s/n", pAdapter->GatewayList.IpAddress.String);
printf("/t***/n");
if (pAdapter->DhcpEnabled) {
printf("/tDHCP Enabled: Yes/n");
printf("/t/tDHCP Server: /t%s/n", pAdapter->DhcpServer.IpAddress.String);
}
else
printf("/tDHCP Enabled: No/n");
pAdapter = pAdapter->Next;
}
if (pAdapterInfo)
free(pAdapterInfo);
return 0;
}