您的位置:首页 > 编程语言 > C语言/C++

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

2014-06-30 15:35 597 查看
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];     //主DNSchar m_BackupDns[MAX_IP_ADDR_LEN];      //附属DNSchar 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;}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐