Windows中通过ipconfig获得网卡信息

原创 2007年10月13日 15:03:00

我们在网络程序设计中有时可能会用MAC地址,如果我们用VC++的话可以用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


 

ipconfig命令详解

ipconfig是调试计算机网络的常用命令,通常大家使用它显示计算机中网络适配器的ip地址、子网掩码及默认网关!...
  • kevinhg
  • kevinhg
  • 2011年04月06日 15:12
  • 7097

dos命令之 ipconfig (网络诊断与配置)使用详解

ipconfig /?      显示帮助信息   ipconfig /all      显示所有网卡的tcp/ip配置信息。如果没有该参数则只显示各网卡的ip地址,子网掩码和默认网关地址。 ...
  • wang740209668
  • wang740209668
  • 2017年08月27日 18:11
  • 132

电脑输入ipconfig 出现:"ipconfig不是内部或外部命令",怎么造成的?

谢谢大家,问题找到了。 可以在c:\windows\system32目录找到ipconfig.exe 在DOS窗口中将目录转到c:\windows\system32后执行ipconfig是可以执行的。...
  • u011571993
  • u011571993
  • 2016年09月04日 16:58
  • 2775

ipconfig命令的使用方法

ipconfig可用于显示当前的TCP/IP配置的设置值,通常是用来检验人工配置的TCP/IP设置是否正确。当我们所在的局域网使用了动态主机配置协议(DHCP),那么我们就很可能经常跟ipconfig...
  • louyongfeng3613
  • louyongfeng3613
  • 2015年08月04日 23:19
  • 1210

Python获取本机所有网卡ip,掩码和广播地址

搜了一天,竟然没找到一段合适的代码来获取机器中所有网卡的ip,掩码和广播地址,大部分都是用socket,但是socket通常返回的要不就是内网地址,要不就是公网地址,不能够找到所有地址,真的太忧桑了,...
  • xanxus46
  • xanxus46
  • 2015年03月27日 20:34
  • 10170

Windows主机与VirtualBox虚拟机下的Linux共享网络和windows本机ip和dns地址怎么查?

VirtualBox是德国一家软件公司InnoTek所开发的虚拟机系统软件,VirtualBox不仅具有丰富的特色,而且性能 也很优异。更是开源的,成为了一个发布在GPL许可之下的自由软件。Virtu...
  • xyl295528322
  • xyl295528322
  • 2014年07月10日 14:40
  • 1181

java代码 调用dos的ipconfig /all 命令,获取网卡详细信息

package test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt...
  • JavaAlpha
  • JavaAlpha
  • 2011年12月15日 15:51
  • 3456

windows平台下 c++获取 系统版本 网卡 内存 CPU 硬盘 显卡信息

GetsysInfo.h: #ifndef _H_GETSYSINFO #define _H_GETSYSINFO #pragma once #include class GetSys...
  • whatday
  • whatday
  • 2015年04月10日 13:52
  • 6559

Windows系统的电脑网卡,生产日期等信息查询

1.电脑产品类型和型号 dos下执行systeminfo这个命令 2.有线,无线网卡地址 dos下执行ipconfig /all 3.生产日期 dos下执行systeminfo这个命令...
  • u010627840
  • u010627840
  • 2016年12月28日 10:30
  • 399

windows下获取网卡信息

方法一: void main() { int i; int s32Num = 0; NCB ncb; LANA_ENUM lana_enum; typedef st...
  • firstime_tzjz
  • firstime_tzjz
  • 2013年02月05日 09:37
  • 3077
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Windows中通过ipconfig获得网卡信息
举报原因:
原因补充:

(最多只允许输入30个字)