求助:在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,基本的解决思路我已经明白了,真的很感谢你的帮助. ----------------解决方案--------------------------------------------------------