VC++ 获取网卡IP、DNS、适配器名称

VS2008--Unicode--

bool GetPcNetInfo()
{
 bool bRt = true;
 /*******************************************
 *通过Iphlpapi库获取网卡信息和个数
 ********************************************/
 PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
 ULONG stSize = sizeof(IP_ADAPTER_INFO);
 int nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize); //获得其大小
 if (ERROR_BUFFER_OVERFLOW == nRel) //重新申请所需要的空间
 {
  delete pIpAdapterInfo;
  pIpAdapterInfo = (PIP_ADAPTER_INFO) new BYTE[stSize];
  nRel=GetAdaptersInfo(pIpAdapterInfo, &stSize);
 }
 if (ERROR_SUCCESS == nRel) //获取信息成功
 {
  m_AdapterInfo.pIpAdapterInfo = pIpAdapterInfo;
  m_AdapterInfo.iCount = 0;
  while (pIpAdapterInfo) //获取网卡个数
  {
   m_AdapterInfo.iCount++;
   pIpAdapterInfo = pIpAdapterInfo->Next;
  }
 }
 /*******************************************
 *通过mprapi库获取连接名称
 *并通过index将网卡信息和连接名称相关联
 ********************************************/
 HANDLE hMprConfig; //连接信息的句柄
 DWORD dwRet=0; //返回值
 PIP_INTERFACE_INFO plfTable = NULL; //接口信息表
 DWORD dwBufferSize=0; //接口信息表空间大小
 m_AdapterInfo.csConnectName = new TCHAR [m_AdapterInfo.iCount] [256]; //申请空间存储连接名
 dwRet = MprConfigServerConnect(NULL, &hMprConfig); //获得句柄
 dwRet = GetInterfaceInfo(NULL, &dwBufferSize); //获得接口信息表大小
 if(dwRet == ERROR_INSUFFICIENT_BUFFER) //获得接口信息
 {
  plfTable = (PIP_INTERFACE_INFO)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwBufferSize);
  GetInterfaceInfo(plfTable, &dwBufferSize);
 }
 TCHAR szFriendName[256]; //接口名称
 DWORD tchSize = sizeof(TCHAR) * 256;
 ZeroMemory(&szFriendName, tchSize);
 for (UINT i = 0; i < plfTable->NumAdapters; i++)
 {
  IP_ADAPTER_INDEX_MAP AdaptMap; //接口信息
  AdaptMap = plfTable->Adapter[i];
  dwRet = MprConfigGetFriendlyName(hMprConfig, AdaptMap.Name,
   (PWCHAR)szFriendName, tchSize); //获得连接名称unicode
  USES_CONVERSION;
  //char* pName = W2A((PWCHAR)szFriendName); //转换为ansi
  InsertConnectName(AdaptMap.Index, szFriendName); //根据Index存储名字信息
 }
 HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, plfTable);
 //*********************************************************************
 //*******写网络配置相关信息到文件**************************************
 PIP_ADAPTER_INFO pIpAdapterInfoWt = m_AdapterInfo.pIpAdapterInfo;
 for (UINT i = 0;i < m_AdapterInfo.iCount;i++)
 {
  //写网络适配器的名称
  CString str_adpname = _T("");
  str_adpname.Format(_T("AdapterName%d"),i);
  //是否自动获取IP信息DhcpEnabled
  CString str_dhcpenabled = _T("");
  str_dhcpenabled.Format(_T("DhcpEnabled%d"),i);
  CString str_dhcpenabledvl = _T("");
  str_dhcpenabledvl.Format(_T("%d"),pIpAdapterInfoWt->DhcpEnabled);
  //写MAC地址
  CString str_mac = _T("");
  str_mac.Format(_T("MAC%d"),i);
  CString str_macvl= _T("");
  str_macvl.Format(_T("%02X%02X%02X%02X%02X%02X"),
   pIpAdapterInfoWt->Address[0],
   pIpAdapterInfoWt->Address[1],
   pIpAdapterInfoWt->Address[2],
   pIpAdapterInfoWt->Address[3],
   pIpAdapterInfoWt->Address[4],
   pIpAdapterInfoWt->Address[5]);
  //写IP地址
  CString str_ip = _T("");
  str_ip.Format(_T("IP%d"),i);
  CString str_ipvl = _T("");
  str_ipvl.Format(_T("%s"), CStringW(pIpAdapterInfoWt->IpAddressList.IpAddress.String));
  //子网掩码
  CString str_subnetmask = _T("");
  str_subnetmask.Format(_T("SubnetMask%d"),i);
  CString str_subnetmaskvl = _T("");
  str_subnetmaskvl.Format(_T("%s"),CStringW(pIpAdapterInfoWt->IpAddressList.IpMask.String));
  //网关
  CString str_gateway = _T("");
  str_gateway.Format(_T("Gateway%d"),i);
  CString str_gatewayvl = _T("");
  str_gatewayvl.Format(_T("%s"),CStringW(pIpAdapterInfoWt->GatewayList.IpAddress.String));
  //Dns服务器
  IP_PER_ADAPTER_INFO* pPerAdapt	= NULL;
  ULONG ulLen = 0;
  int err = GetPerAdapterInfo( pIpAdapterInfoWt->Index, pPerAdapt, &ulLen);
  if( err == ERROR_BUFFER_OVERFLOW )
  {
   pPerAdapt = ( IP_PER_ADAPTER_INFO* ) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, ulLen);
   err = GetPerAdapterInfo( pIpAdapterInfoWt->Index, pPerAdapt, &ulLen );
   if( err == ERROR_SUCCESS )
   {
    IP_ADDR_STRING* pNext = &( pPerAdapt->DnsServerList );
    if (pNext && strcmp(pNext->IpAddress.String, "") != 0)//自动获取为false
    {
     //dsn是否自动获取
     CString str_dnsdhcp = _T("");
     str_dnsdhcp.Format(_T("DnsDhcpEnabled%d"),i);
     CString str_dnsdhcpvl = _T("0");
     //dsn-PrimaryDns
     CString str_primaryDns = _T("");
     str_primaryDns.Format(_T("PrimaryDns%d"),i);
     CString str_primaryDnsvl = _T("");
     str_primaryDnsvl.Format(_T("%s"),CStringW(pNext->IpAddress.String));
     //dns-backupdns
     CString str_backupdns = _T("");
     str_backupdns.Format(_T("BackupDns%d"),i);
     if (pNext=pNext->Next)
     {
      CString str_backupdnsvl = _T("");
      str_backupdnsvl.Format(_T("%s"),CStringW(pNext->IpAddress.String));
      //m_pIniFile->WriteString(_T("System"),str_backupdns, str_backupdnsvl);
     }
     
    }
    else //dns自动获取为true
    {
     //dsn是否自动获取
     CString str_dnsdhcp = _T("");
     str_dnsdhcp.Format(_T("DnsDhcpEnabled%d"),i);
     CString str_dnsdhcpvl = _T("1");
 
    }
   }
   HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, pPerAdapt);
  }
  pIpAdapterInfoWt = pIpAdapterInfoWt->Next;
 }
 
 return bRt;
}
void InsertConnectName(ULONG index, TCHAR *pName)
{
 PIP_ADAPTER_INFO pIpAdapterInfo = m_AdapterInfo.pIpAdapterInfo;
 for (int i = 0; i < m_AdapterInfo.iCount; i++)
 {
  if (pIpAdapterInfo->Index == index)
  {
   wcscpy(m_AdapterInfo.csConnectName[i], pName);//适配器名称
  }
  pIpAdapterInfo = pIpAdapterInfo->Next;
 }
}

//备注:另外需要的.h及.cpp文件
<pre name="code" class="cpp">#ifndef _ADAPTERINFO_H_
#define _ADAPTERINFO_H_

#define MAX_IP_ADDR_LEN 16              //最大IP长度
#define MAX_MAC_ADDR_LEN 13             //MAC最大长度
#define MAX_NAME_LEN 256                //最大连接名称长度

#define CONNECTNAME "CONNECTNAME"
#define IPDHCP "IPDHCP"
#define DNSDHCP "DNSDHCP"
#define IPADDRESS "IPADDRESS"
#define MASK "MASK"
#define GATEWAY "GATEWAY"
#define PRIMARYDNS "PRIMARYDNS"
#define BACKUPDNS "BACKUPDNS"
#define MACADDR   "MACADDR"


#define WM_MSG_MODIFY_COMPLETE WM_USER + 100  //设置完成消息

typedef struct _AdapterInfo
{
	PIP_ADAPTER_INFO pIpAdapterInfo;          //通过iphlpapi库获取
	int iCount;                               //适配器个数
	TCHAR (*csConnectName)[MAX_NAME_LEN];     //连接名称
}AdapterInfo;

class PlanInfo
{
public:
	char m_PlanName[MAX_NAME_LEN];          //方案名称
	char m_ConnectName[MAX_NAME_LEN];	    //连接名称
	BOOL m_IsIpDHCP;                        //IP是否自动获取
	BOOL m_IsDNSDHCP;                       //DNS是否自动获取   
	char m_IpAddress[MAX_IP_ADDR_LEN];      //IP地址
	char m_Mask[MAX_IP_ADDR_LEN];           //子网掩码
	char m_GateWay[MAX_IP_ADDR_LEN];        //网关
	char m_PrimaryDns[MAX_IP_ADDR_LEN];     //主DNS
	char m_BackupDns[MAX_IP_ADDR_LEN];      //附属DNS
	char m_MacAddr[MAX_MAC_ADDR_LEN];       //MAC地址
	PlanInfo();
	~PlanInfo();
	BOOL SetConnectName(char *pName);
	BOOL SetDHCPFlag(BOOL flag);
	BOOL SetIpInfo(char *pIpAddr, char *pMask, char *pGateWay);
	BOOL SetDns(char *pPrimaryDns, char *pBackupDns);
	BOOL SetMacAddr(char *pMac);
};
#endif


 
<pre name="code" class="cpp">#include "stdafx.h"
#include "AdapterInfo.h"

PlanInfo::PlanInfo()
{
	m_IsDNSDHCP = TRUE;
	m_IsDNSDHCP = TRUE;
	strcpy(m_IpAddress, "0.0.0.0");
	strcpy(m_Mask, "0.0.0.0");
	strcpy(m_GateWay, "0.0.0.0");
	strcpy(m_MacAddr, "");
}

PlanInfo::~PlanInfo()
{
	;
}

BOOL PlanInfo::SetConnectName(char *pName)
{
	strcpy(m_ConnectName, pName);
	return TRUE;
}

BOOL PlanInfo::SetDHCPFlag(BOOL flag)
{
	m_IsIpDHCP = flag;
	return TRUE;
}

BOOL PlanInfo::SetIpInfo(char *pIpAddr, char *pMask, char *pGateWay)
{
	strcpy(m_IpAddress, pIpAddr);
	strcpy(m_Mask, pMask);
	strcpy(m_GateWay, pGateWay);
	return TRUE;
}

BOOL PlanInfo::SetDns(char *pPrimaryDns, char *pBackupDns)
{
	strcpy(m_PrimaryDns, pPrimaryDns);
	strcpy(m_BackupDns, pBackupDns);
	return TRUE;
}

BOOL PlanInfo::SetMacAddr(char *pMac)
{
	strcpy(m_MacAddr, pMac);
	return TRUE;
}


 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值