Windows中通过ipconfig获得网卡信息
2007-10-13 15:03
274 查看
我们在网络程序设计中有时可能会用MAC地址,如果我们用VC++的话可以用
CArray<AdapterInfo,AdapterInfo>& AdapterInfoList,CString Error)
{
HANDLE hRead,hWrite;//定义输入输出句柄
CString strError;//错误信息
CString strCon,strBuf;
BOOL nReturn;
char buffer[2048]={0};
LPSTR p="ipconfig /all";
unsigned long lnReadNum;
int nIndex=0,from=0,to=0,nLoop=0;
STARTUPINFO sa;
PROCESS_INFORMATION pinfo;
SECURITY_ATTRIBUTES saPipe;
saPipe.nLength= sizeof( SECURITY_ATTRIBUTES );
saPipe.lpSecurityDescriptor = NULL;
saPipe.bInheritHandle = TRUE;
if (!CreatePipe(&hRead,&hWrite,&saPipe,0))//创建管道
{
strError.Format("CREATE PIPE ERRORCODE:%d",GetLastError());
Error=strError;
return 1;
}
memset( &sa, 0, sizeof(sa));
sa.cb=sizeof(sa);
sa.dwFlags=STARTF_USESHOWWINDOW |STARTF_USESTDHANDLES;
sa.wShowWindow = SW_HIDE;
sa.hStdOutput=hWrite;
sa.hStdError=hWrite;
//建立进程
nReturn=::CreateProcess(NULL,p,&saPipe,&saPipe,
TRUE,0,NULL,NULL,&sa,&pinfo);
if (!nReturn)
{
strError.Format("CREATE PROCESS ERRORCODE:%d",GetLastError());
Error=strError;
return 2;
}
//Sleep(1000);
CloseHandle( pinfo.hThread );
CloseHandle( pinfo.hProcess );
CloseHandle( hWrite);
//读即管道的输出
do{
memset(buffer,0,2048);
nReturn=ReadFile(hRead,buffer,MAX_PATH,&lnReadNum,NULL);
if (nReturn)
{
strBuf.Format("%s",buffer);
strCon+=strBuf;
}
}while(nReturn&&lnReadNum);
AdapterInfo info;
//输出信息里查找网卡信息
do
{
nIndex=strCon.Find("Description",nIndex);
if (nIndex<=-1)
{
break;
}
from=strCon.Find(":",nIndex)+2;
to=strCon.Find("/n",from);
info.Description=strCon.Mid(from,to-from-1);
nIndex=to;
nIndex=strCon.Find("Physical Address",nIndex);
from=strCon.Find(":",nIndex)+2;
to=strCon.Find("/n",from);
info.PhysicalAddr=strCon.Mid(from,to-from-1);
nIndex=to;
nLoop=0;
while(nLoop<64)
{
nIndex=strCon.Find("IP Address",nIndex);
if (nIndex<=-1)
{
break;
}
from=strCon.Find(":",nIndex)+2;
to=strCon.Find("/n",from);
info.IpAddr[nLoop]=strCon.Mid(from,to-from-1);
nIndex=to;
nIndex=strCon.Find("Subnet Mask",nIndex);
from=strCon.Find(":",nIndex)+2;
to=strCon.Find("/n",from);
info.SubnetMask[nLoop]=strCon.Mid(from,to-from-1);
nLoop++;
}
info.lIpNum=nLoop;
nIndex=to;
nIndex=strCon.Find("Default Gateway",nIndex);
from=strCon.Find(":",nIndex)+2;
to=strCon.Find("/n",from);
info.Gateway=strCon.Mid(from,to-from-1);
AdapterInfoList.Add(info);
}while(TRUE);
return 0;
}
方法只是管道的一种最基本的应用,拿来与大家分享一下!另外我们还可以用IP帮助函数来获得IP
UCHAR Netbios( PNCB pncb /* pointer to the network control block*/)获取;但是我在实际的应用过程中发现它并不是每次都管用的.在一个有无线网卡的笔记本上,我一个装有虚拟机的笔记本上都现我了获取不到MAC的情况,也许我对这个函数的用法没有深入了解吧!
我借用了JAVA程序在通用的一种获取MAC的方法,借用IPCONFIG来获得所有网卡的信息。下面我们就来看一下具体方法。
首先我们定义一个结构用于保存网卡信息:
typedef struct _tagAdapterInfo{ CString Description;//网卡描述 CString PhysicalAddr;//MAC CString IpAddr[64];//IP地址最多64个 CString SubnetMask[64];//每个IP对的掩码最多64个 CString Gateway;//默认网关 LONG lIpNum;//网卡对应的IP数 }AdapterInfo,*PAdapterInfo;
我们定义一个获得本机所有网卡信息的方法:
int GetAllAdapterInfo(CArray<AdapterInfo,AdapterInfo>& AdapterInfoList,
CString& Error);
下面让我们来看一下实现:
int CTestDlg::GetAllAdapterInfo(
CArray<AdapterInfo,AdapterInfo>& AdapterInfoList,CString Error)
{
HANDLE hRead,hWrite;//定义输入输出句柄
CString strError;//错误信息
CString strCon,strBuf;
BOOL nReturn;
char buffer[2048]={0};
LPSTR p="ipconfig /all";
unsigned long lnReadNum;
int nIndex=0,from=0,to=0,nLoop=0;
STARTUPINFO sa;
PROCESS_INFORMATION pinfo;
SECURITY_ATTRIBUTES saPipe;
saPipe.nLength= sizeof( SECURITY_ATTRIBUTES );
saPipe.lpSecurityDescriptor = NULL;
saPipe.bInheritHandle = TRUE;
if (!CreatePipe(&hRead,&hWrite,&saPipe,0))//创建管道
{
strError.Format("CREATE PIPE ERRORCODE:%d",GetLastError());
Error=strError;
return 1;
}
memset( &sa, 0, sizeof(sa));
sa.cb=sizeof(sa);
sa.dwFlags=STARTF_USESHOWWINDOW |STARTF_USESTDHANDLES;
sa.wShowWindow = SW_HIDE;
sa.hStdOutput=hWrite;
sa.hStdError=hWrite;
//建立进程
nReturn=::CreateProcess(NULL,p,&saPipe,&saPipe,
TRUE,0,NULL,NULL,&sa,&pinfo);
if (!nReturn)
{
strError.Format("CREATE PROCESS ERRORCODE:%d",GetLastError());
Error=strError;
return 2;
}
//Sleep(1000);
CloseHandle( pinfo.hThread );
CloseHandle( pinfo.hProcess );
CloseHandle( hWrite);
//读即管道的输出
do{
memset(buffer,0,2048);
nReturn=ReadFile(hRead,buffer,MAX_PATH,&lnReadNum,NULL);
if (nReturn)
{
strBuf.Format("%s",buffer);
strCon+=strBuf;
}
}while(nReturn&&lnReadNum);
AdapterInfo info;
//输出信息里查找网卡信息
do
{
nIndex=strCon.Find("Description",nIndex);
if (nIndex<=-1)
{
break;
}
from=strCon.Find(":",nIndex)+2;
to=strCon.Find("/n",from);
info.Description=strCon.Mid(from,to-from-1);
nIndex=to;
nIndex=strCon.Find("Physical Address",nIndex);
from=strCon.Find(":",nIndex)+2;
to=strCon.Find("/n",from);
info.PhysicalAddr=strCon.Mid(from,to-from-1);
nIndex=to;
nLoop=0;
while(nLoop<64)
{
nIndex=strCon.Find("IP Address",nIndex);
if (nIndex<=-1)
{
break;
}
from=strCon.Find(":",nIndex)+2;
to=strCon.Find("/n",from);
info.IpAddr[nLoop]=strCon.Mid(from,to-from-1);
nIndex=to;
nIndex=strCon.Find("Subnet Mask",nIndex);
from=strCon.Find(":",nIndex)+2;
to=strCon.Find("/n",from);
info.SubnetMask[nLoop]=strCon.Mid(from,to-from-1);
nLoop++;
}
info.lIpNum=nLoop;
nIndex=to;
nIndex=strCon.Find("Default Gateway",nIndex);
from=strCon.Find(":",nIndex)+2;
to=strCon.Find("/n",from);
info.Gateway=strCon.Mid(from,to-from-1);
AdapterInfoList.Add(info);
}while(TRUE);
return 0;
}
方法只是管道的一种最基本的应用,拿来与大家分享一下!另外我们还可以用IP帮助函数来获得IP
相关文章推荐
- window下c语言通过WMI获得网卡MAC地址,硬盘序号,主板序号等硬件信息
- 通过WMI获得网卡MAC地址,硬盘序号,主板序号等硬件信息
- windows环境下通过添加静态路由信息,实现多网卡环境下,指定某网络由某网卡来连接
- (win和win server)dos下通过wmic命令查看硬盘和内存/CPU信息(windows自带命令查看硬件信息)
- Asp.net通过IP地址获得域名信息
- Java调用ipconfig打印网卡信息和本机的MAC地址
- python通过pil模块获得图片exif信息的方法
- 通过表名获得列名信息,返回json串
- 如何利用Java获取进程的信息(通过tasklist和cmd与Windows进行交互)
- C++ 中通过GetAdaptersInfo获取网卡配置和Ip地址信息
- vc获得网卡流量信息
- Python3.5 Windows 7下 利用百度识图来获得图片信息
- 通过 PackageManager 获得你想要的 App 信息
- windows 获得系统信息 GetSystemInfo
- Java中通过反射获得对象的属性信息
- iOS开发:通过经纬度获得城市、省份等信息 推荐
- Windows 下通过命令行启用、禁用网卡
- python利用wmi模块统计windows下网卡信息和连接数
- 通过新浪IP服务器获得的当前客户端IP地址对应的国家、省份或直辖市、城市信息
- 如何配置ubuntu到windows的无线网卡路由(测试通过)