| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3405 人关注过本帖, 1 人收藏
标题:求助:在VC中怎么获取本地主机的子网掩码和网卡类型?
只看楼主 加入收藏
jun0325
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2007-8-8
收藏(1)
 问题点数:0 回复次数:7 
求助:在VC中怎么获取本地主机的子网掩码和网卡类型?
如题:
  我想在VC中实现获取本地主机的子网掩码和网卡类型,请问各位大虾,需要用到哪些函数,具体思路是怎么样的

[[it] 本帖最后由 jun0325 于 2008-4-27 18:51 编辑 [/it]]
搜索更多相关主题的帖子: 子网 网卡 主机 类型 获取 
2008-04-27 14:09
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 
#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 ;
}
2008-04-28 10:51
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分: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;
2008-04-28 10:55
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 
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;
2008-04-28 10:55
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 
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;
2008-04-28 11:08
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 
#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]]
2008-04-28 11:26
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 
http://blog.

我也是一点一点搜的 也顺便学习一下
不知道是不是你要的
2008-04-28 11:27
jun0325
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2007-8-8
收藏
得分:0 
在VC中怎么获取本地主机的子网掩码和网卡类型?
感谢cdmalcl,基本的解决思路我已经明白了,真的很感谢你的帮助.

数据结构+算法+程序设计方法+语言工具和环境=程序
2008-04-28 11:57
快速回复:求助:在VC中怎么获取本地主机的子网掩码和网卡类型?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.045835 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved