当前位置: 代码迷 >> C语言 >> 求助:在VC中怎么获取本地主机的子网掩码和网卡类型?
  详细解决方案

求助:在VC中怎么获取本地主机的子网掩码和网卡类型?

热度:355   发布时间:2008-04-27 14:09:14.0
求助:在VC中怎么获取本地主机的子网掩码和网卡类型?
如题:
  我想在VC中实现获取本地主机的子网掩码和网卡类型,请问各位大虾,需要用到哪些函数,具体思路是怎么样的

[[it] 本帖最后由 jun0325 于 2008-4-27 18:51 编辑 [/it]]
搜索更多相关的解决方案: 子网  网卡  主机  类型  获取  

----------------解决方案--------------------------------------------------------
#include <windows.h>         
#include <stdio.h>
#include <iphlpapi.h> //需要安装Microsoft Platform SDK

#pragma   comment   (lib,"C:\\Program Files\\Microsoft Platform SDK\\Lib\\iphlpapi.lib")
   
int main(void)   
{   
         
    PIP_ADAPTER_INFO pAdapterInfo ;
    PIP_ADAPTER_INFO pAdapter = NULL ;
    DWORD dwRetVal = 0 ;

    //为适配器结构申请内存
    pAdapterInfo = (IP_ADAPTER_INFO *) malloc( sizeof(IP_ADAPTER_INFO) ) ;
    ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO) ;

    
    if (GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW)
    {
        free(pAdapterInfo) ;
        pAdapterInfo = (IP_ADAPTER_INFO *) malloc (ulOutBufLen) ;
    }

    //获取本地适配器结构信息
    if ((dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen)) == NO_ERROR)
    {
        //以链表形式输出结构信息
        pAdapter = pAdapterInfo ;
        while (pAdapter)
        {
            printf("\tAdapter Name: \t%s\n", pAdapter->AdapterName) ;
            printf("\tAdapter Desc: \t%s\n", pAdapter->Description) ;
            printf("\tAdapter Addr: \t%ld\n", pAdapter->Address) ;
            printf("\tIP Address: \t%s\n", pAdapter->IpAddressList.IpAddress.String) ;
            printf("\tIP Mask: \t%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) ;
                printf("\tLease Obtained: %ld\n", pAdapter->LeaseObtained) ;
            }
            else
                printf("\tDHCP Enabled: No\n") ;
   
            if (pAdapter->HaveWins)
            {
                printf("\tHave Wins: Yes\n") ;
                printf("\t\tPrimary Wins Server: \t%s\n", pAdapter->PrimaryWinsServer.IpAddress.String) ;
                printf("\t\tSecondary Wins Server: \t%s\n", pAdapter->SecondaryWinsServer.IpAddress.String) ;
            }
            else
                printf("\tHave Wins: No\n") ;
            pAdapter = pAdapter->Next ;
        }
    }
    else
    {
        printf("Call to GetAdaptersInfo failed.\n") ;
    }

    return 0 ;
}
----------------解决方案--------------------------------------------------------
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];//物理地址,每个字节存放一个十六进制的数值,配合上一个数据域在printf中用x格式把每个字节输出。

  DWORD Index;//网卡索引号

  UINT Type;//网卡类型

  UINT DhcpEnabled;//是否启用了DHCP动态IP分配

  PIP_ADDR_STRING CurrentIpAddress;//当前使用的IP地址

  IP_ADDR_STRING IpAddressList;//绑定到此网卡的IP地址链表,重要项目

  IP_ADDR_STRING GatewayList;//网关地址链表,重要项目

  IP_ADDR_STRING DhcpServer;//DHCP服务器地址,只有在DhcpEnabled==TRUE的情况下才有效

  BOOL HaveWins;//是否启用了WINS

   IP_ADDR_STRING PrimaryWinsServer;//主WINS地址

  IP_ADDR_STRING SecondaryWinsServer;//辅WINS地址

  time_t LeaseObtained;//当前DHCP租借获取的时间

  time_t LeaseExpires;//当前DHCP租借失效时间。这两个数据结构只有在启用了DHCP时才有用。

} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;
----------------解决方案--------------------------------------------------------
IP_INTERFACE_INFO结构的解释如下:

typedef struct _IP_INTERFACE_INFO {
  LONG NumAdapters;// 动态数组中网络接口元素的个数,通过它来遍历数组

  IP_ADAPTER_INDEX_MAP Adapter[1];// 网络接口数据数组

} IP_INTERFACE_INFO,*PIP_INTERFACE_INFO;



其中的IP_ADAPTER_INDEX_MAP结构如下:

typedef struct _IP_ADAPTER_INDEX_MAP {
  ULONG Index;// 网卡索引

  WCHAR Name[MAX_ADAPTER_NAME];// 网卡名

} IP_ADAPTER_INDEX_MAP, * PIP_ADAPTER_INDEX_MAP;
----------------解决方案--------------------------------------------------------
typedef struct _IP_ADDR_STRING {  
struct _IP_ADDR_STRING* Next;  
IP_ADDRESS_STRING IpAddress;  
IP_MASK_STRING IpMask;  DWORD Context;
} IP_ADDR_STRING,  *PIP_ADDR_STRING;


typedef struct {
  char String[4 * 4];
} IP_ADDRESS_STRING, *PIP_ADDRESS_STRING, IP_MASK_STRING, *PIP_MASK_STRING;
----------------解决方案--------------------------------------------------------
#include <windows.h>         
#include <stdio.h>
#include <iphlpapi.h> //需要安装Microsoft Platform SDK

#pragma   comment   (lib,"C:\\Program Files\\Microsoft Platform SDK\\Lib\\iphlpapi.lib")
   
int main(void)   
{         
    PIP_ADAPTER_INFO pAdapterInfo ;
    PIP_ADAPTER_INFO pAdapter = NULL ;
    DWORD dwRetVal = 0 ;

    //为适配器结构申请内存
    pAdapterInfo = (IP_ADAPTER_INFO *) malloc( sizeof(IP_ADAPTER_INFO) ) ;
    ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO) ;

    
    if (GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW)
    {
        free(pAdapterInfo) ;
        pAdapterInfo = (IP_ADAPTER_INFO *) malloc (ulOutBufLen) ;
    }

    //获取本地适配器结构信息
    if ((dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen)) == NO_ERROR)
    {
        //以链表形式输出结构信息
        pAdapter = pAdapterInfo ;
        while (pAdapter)
        {
            printf("\t网卡名: \t%s\n", pAdapter->AdapterName) ;
            printf("\t对网卡的描述: \t%s\n", pAdapter->Description) ;
            printf("\t物理地址: \t%ld\n", pAdapter->Address) ;
            printf("\tIP地址: \t%s\n", pAdapter->IpAddressList.IpAddress.String) ;
            printf("\tIP掩码: \t%s\n", pAdapter->IpAddressList.IpMask.String) ;

            printf("\t网关地址链表: \t%s\n", pAdapter->GatewayList.IpAddress.String) ;
            printf("\t***\n") ;
            if (pAdapter->DhcpEnabled)
            {
                printf("\tDHCP服务开启: Yes\n") ;
                printf("\t\tDHCP服务: \t%s\n", pAdapter->DhcpServer.IpAddress.String) ;
                printf("\t租赁信息: %ld\n", pAdapter->LeaseObtained) ;
            }
            else
                printf("\tDHCP服务开启: No\n") ;
   
            if (pAdapter->HaveWins)
            {
                printf("\t启用Wins: Yes\n") ;
                printf("\t\t主WINS地址: \t%s\n", pAdapter->PrimaryWinsServer.IpAddress.String) ;
                printf("\t\t辅WINS地址: \t%s\n", pAdapter->SecondaryWinsServer.IpAddress.String) ;
            }
            else
                printf("\t启用Wins: No\n") ;
            pAdapter = pAdapter->Next ;
        }
    }
    else
    {
        printf("GetAdaptersInfo函数调用失败.\n") ;
    }

    return 0 ;
}

[[it] 本帖最后由 cdmalcl 于 2008-4-28 11:31 编辑 [/it]]
----------------解决方案--------------------------------------------------------
http://blog.163.com/lishili_1982/blog/static/61875520080503337920/

我也是一点一点搜的 也顺便学习一下
不知道是不是你要的
----------------解决方案--------------------------------------------------------
在VC中怎么获取本地主机的子网掩码和网卡类型?
感谢cdmalcl,基本的解决思路我已经明白了,真的很感谢你的帮助.
----------------解决方案--------------------------------------------------------
  相关解决方案