分享

使用GetAdaptersInfo管理网卡

 bayji 2012-03-27

使用GetAdaptersInfo管理网卡

699人阅读 评论(0) 收藏 举报

使用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;

}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约