Windows获取本地机器的全部网络配置信息

 Q:

WINSOCK库的GetAddressByName 和gethostbyname 返回的信息无法满足我的要求,我想获取更详细的信息,我要知道一切信息,至少要像ipconfig /all 命令输出那样详细, 怎么办?

A:

使用windows SDK提供的IP Helper 库吧,它可以解决你上述的所有要求,使用它,你可以获取或配置本机的TCP/IP( Transmission Control Protocol/Internet Protocol )网络.

它甚至可以帮你发ARP包,你只需要调用SendARP ()这个函数...

Header

Declared in Iphlpapi.h.

Library

Use Iphlpapi.lib.

下面给出类似ipconfig /all的功能的示例

  1. #include "stdafx.h"
  2. #include <winsock2.h>
  3. #include <ws2tcpip.h>
  4. #include <windows.h>
  5. #include <iphlpapi.h>
  6. #include <comutil.h>
  7. int  IpConfigAll()
  8. {
  9.     MIB_IPSTATS ipstats;
  10.     GetIpStatistics(&ipstats);
  11.     printf("number of interface: %d/nnumber of address: %d/n",
  12.         ipstats.dwNumIf,ipstats.dwNumAddr);
  13.     PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL;
  14.     ULONG OutBufferLength = 0;
  15.     ULONG RetVal = 0, i;    
  16.     int j;
  17.     // The size of the buffer can be different 
  18.     // between consecutive API calls.
  19.     // In most cases, i < 2 is sufficient;
  20.     // One call to get the size and one call to get the actual parameters.
  21.     // But if one more interface is added or addresses are added, 
  22.     // the call again fails with BUFFER_OVERFLOW. 
  23.     // So the number is picked slightly greater than 2. 
  24.     // We use i <5 in the example
  25.     for (i = 0; i < 5; i++) {
  26.         RetVal = 
  27.             GetAdaptersAddresses(
  28.                 AF_INET, 
  29.                 0,
  30.                 NULL, 
  31.                 AdapterAddresses, 
  32.                 &OutBufferLength);
  33.         
  34.         if (RetVal != ERROR_BUFFER_OVERFLOW) {
  35.             break;
  36.         }
  37.         if (AdapterAddresses != NULL) {
  38.             FREE(AdapterAddresses);
  39.         }
  40.         
  41.         AdapterAddresses = (PIP_ADAPTER_ADDRESSES) 
  42.             MALLOC(OutBufferLength);
  43.         if (AdapterAddresses == NULL) {
  44.             RetVal = GetLastError();
  45.             break;
  46.         }
  47.     }
  48.     
  49.     if (RetVal == NO_ERROR) {
  50.       // If successful, output some information from the data we received
  51.       PIP_ADAPTER_ADDRESSES AdapterList = AdapterAddresses;
  52.       while (AdapterList) {
  53.           printf("interface(%d:%s) %d  %s:/n"
  54.               AdapterList->IfType,
  55.               AdapterList->AdapterName,
  56.               AdapterAddresses->IfIndex,
  57.               (const char*)_bstr_t(AdapterList->FriendlyName));
  58.         
  59.         printf("/tDescription: %ws/n", AdapterList->Description);
  60.         printf("/tDhcp Enabled: %s/n", AdapterList->Dhcpv4Enabled?"Yes":"No");
  61.         printf("/tOperStatus : %s/n", (AdapterList->OperStatus==IfOperStatusUp)?"Up":"Down");
  62.         printf("/tDnsSuffix: %ws/n", AdapterList->DnsSuffix?AdapterList->DnsSuffix:L"No");
  63.         
  64.         printf("/tUnicastAddress Address:/n");
  65.         
  66.         for(PIP_ADAPTER_UNICAST_ADDRESS_LH paddr = AdapterList->FirstUnicastAddress;
  67.             paddr!=NULL;paddr=paddr->Next)
  68.         {
  69.             printf("/t                  : %s/n"
  70.                 inet_ntoa( ((SOCKADDR_IN *)paddr->Address.lpSockaddr)->sin_addr));
  71.         }
  72.         printf("/tAnycastAddress Address:/n"); 
  73.         for(PIP_ADAPTER_ANYCAST_ADDRESS_XP paddr = AdapterList->FirstAnycastAddress;
  74.             paddr!=NULL;paddr=paddr->Next)
  75.         {
  76.             printf("/t                 : %s/n"
  77.                 inet_ntoa( ((SOCKADDR_IN *)paddr->Address.lpSockaddr)->sin_addr));
  78.         }
  79.         printf("/tMulticast Address:/n");
  80.         for(PIP_ADAPTER_MULTICAST_ADDRESS_XP paddr = AdapterList->FirstMulticastAddress;
  81.             paddr!=NULL;paddr=paddr->Next)
  82.         {
  83.             printf("/t                  : %s/n"
  84.                 inet_ntoa( ((SOCKADDR_IN *)paddr->Address.lpSockaddr)->sin_addr));
  85.         }
  86.         printf("/tDMS server Address:/n");
  87.         for(PIP_ADAPTER_DNS_SERVER_ADDRESS_XP paddr = AdapterList->FirstDnsServerAddress;
  88.             paddr!=NULL;paddr=paddr->Next)
  89.         {
  90.             printf("/t                  : %s/n"
  91.                 inet_ntoa( ((SOCKADDR_IN *)paddr->Address.lpSockaddr)->sin_addr));
  92.         }
  93.         
  94.     
  95.         //AdapterList->FirstGatewayAddress only support at vista.
  96.         //
  97.         //Get default gate way from regkey.
  98.         //
  99.         //HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters/Interfaces
  100.         HKEY hk=NULL;
  101.         WCHAR szSubKey[260] = L"SYSTEM//CurrentControlSet//Services//Tcpip//Parameters//Interfaces//";
  102.         wcscat(szSubKey,_bstr_t(AdapterList->AdapterName));
  103.         RegOpenKey(HKEY_LOCAL_MACHINE,szSubKey,&hk);
  104.         WCHAR  szGateWay[255]=L"";
  105.         DWORD  dwlen=255;
  106.         DWORD lpType =REG_SZ;
  107.         RegQueryValueEx(hk,L"DefaultGateway",NULL,&lpType,(LPBYTE)szGateWay,&dwlen);
  108.         RegCloseKey(hk);
  109.         printf("/tDMS default gateway:/n");
  110.         printf("/t                  : %s/n", (const char*)_bstr_t(szGateWay));
  111.         AdapterList = AdapterList->Next;
  112.       }
  113.     }
  114.     else 
  115.     { 
  116.       LPVOID MsgBuf;
  117.       
  118.       printf("Call to GetAdaptersAddresses failed./n");
  119.       if (FormatMessage( 
  120.         FORMAT_MESSAGE_ALLOCATE_BUFFER | 
  121.         FORMAT_MESSAGE_FROM_SYSTEM | 
  122.         FORMAT_MESSAGE_IGNORE_INSERTS,
  123.         NULL,
  124.         RetVal,
  125.         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
  126.         (LPTSTR) &MsgBuf,
  127.         0,
  128.         NULL )) {
  129.         printf("/tError: %s", MsgBuf);
  130.       }
  131.       LocalFree(MsgBuf);
  132.     }  
  133.     if (AdapterAddresses != NULL) {
  134.         FREE(AdapterAddresses);
  135.     }
  136.     //GetNetworkParams(x,x);
  137.     //
  138.     //TODO:
  139.     // Declare and initialize variables.
  140.     //
  141.     DWORD dwSize = 0;
  142.     DWORD dwRetVal = 0;
  143.     //GetIpForwardTable
  144.     //
  145.     //
  146.     dwSize = sizeof(MIB_IPFORWARDTABLE)*(ipstats.dwNumRoutes+ipstats.dwNumIf);
  147.     PMIB_IPFORWARDTABLE  pIpForwardTable = (PMIB_IPFORWARDTABLE )MALLOC(dwSize);
  148.     if(GetIpForwardTable(pIpForwardTable,&dwSize,FALSE))
  149.     {
  150.         printf("GetIpForwardTable failed /n");
  151.         FREE(pIpForwardTable);
  152.         return 1;
  153.     }
  154.     
  155.     for(i=0;i<pIpForwardTable->dwNumEntries;i++)
  156.     {
  157.         IN_ADDR inaddr;
  158.         inaddr.S_un.S_addr= pIpForwardTable->table[i].dwForwardDest;
  159.         printf("%X %s/n", pIpForwardTable->table[i].dwForwardIfIndex,
  160.             inet_ntoa(inaddr));
  161.     }
  162.     FREE(pIpForwardTable);
  163.     /* variables used for GetIfTable and GetIfEntry */
  164.     MIB_IFTABLE *pIfTable;
  165.     MIB_IFROW *pIfRow;
  166.     // Allocate memory for our pointers.
  167.     pIfTable = (MIB_IFTABLE *) MALLOC(sizeof (MIB_IFTABLE));
  168.     if (pIfTable == NULL) {
  169.         printf("Error allocating memory needed to call GetIfTable/n");
  170.         return 1;
  171.     }
  172.     // Make an initial call to GetIfTable to get the
  173.     // necessary size into dwSize
  174.     dwSize = sizeof (MIB_IFTABLE);
  175.     if (GetIfTable(pIfTable, &dwSize, FALSE) == ERROR_INSUFFICIENT_BUFFER) {
  176.         FREE(pIfTable);
  177.         pIfTable = (MIB_IFTABLE *) MALLOC(dwSize);
  178.         if (pIfTable == NULL) {
  179.             printf("Error allocating memory needed to call GetIfTable/n");
  180.             return 1;
  181.         }
  182.     }
  183.     // Make a second call to GetIfTable to get the actual
  184.     // data we want.
  185.     if ((dwRetVal = GetIfTable(pIfTable, &dwSize, FALSE)) == NO_ERROR) {
  186.         printf("/tNum Entries: %ld/n/n", pIfTable->dwNumEntries);
  187.         for (i = 0; i < (int) pIfTable->dwNumEntries; i++) {
  188.             pIfRow = (MIB_IFROW *) & pIfTable->table[i];
  189.             printf("/tIndex[%d]:/t %ld/n", i, pIfRow->dwIndex);
  190.             printf("/tInterfaceName[%d]:/t %ws", i, pIfRow->wszName);
  191.             printf("/n");
  192.             printf("/tDescription[%d]:/t ", i);
  193.             for (j = 0; j < (int) pIfRow->dwDescrLen; j++)
  194.                 printf("%c", pIfRow->bDescr[j]);
  195.             printf("/n");
  196.             printf("/tType[%d]:/t ", i);
  197.             switch (pIfRow->dwType) {
  198.             case IF_TYPE_OTHER:
  199.                 printf("Other/n");
  200.                 break;
  201.             case IF_TYPE_ETHERNET_CSMACD:
  202.                 printf("Ethernet/n");
  203.                 break;
  204.             case IF_TYPE_ISO88025_TOKENRING:
  205.                 printf("Token Ring/n");
  206.                 break;
  207.             case IF_TYPE_PPP:
  208.                 printf("PPP/n");
  209.                 break;
  210.             case IF_TYPE_SOFTWARE_LOOPBACK:
  211.                 printf("Software Lookback/n");
  212.                 break;
  213.             case IF_TYPE_ATM:
  214.                 printf("ATM/n");
  215.                 break;
  216.             case IF_TYPE_IEEE80211:
  217.                 printf("IEEE 802.11 Wireless/n");
  218.                 break;
  219.             case IF_TYPE_TUNNEL:
  220.                 printf("Tunnel type encapsulation/n");
  221.                 break;
  222.             case IF_TYPE_IEEE1394:
  223.                 printf("IEEE 1394 Firewire/n");
  224.                 break;
  225.             default:
  226.                 printf("Unknown type %ld/n", pIfRow->dwType);
  227.                 break;
  228.             }
  229.             printf("/tMtu[%d]:/t/t %ld/n", i, pIfRow->dwMtu);
  230.             printf("/tSpeed[%d]:/t %ld/n", i, pIfRow->dwSpeed);
  231.             printf("/tPhysical Addr:/t ");
  232.             if (pIfRow->dwPhysAddrLen == 0)
  233.                 printf("/n");
  234.             for (j = 0; j < (int) pIfRow->dwPhysAddrLen; j++) {
  235.                 if (j == (pIfRow->dwPhysAddrLen - 1))
  236.                     printf("%.2X/n", (int) pIfRow->bPhysAddr[j]);
  237.                 else
  238.                     printf("%.2X-", (int) pIfRow->bPhysAddr[j]);
  239.             }
  240.             printf("/tAdmin Status[%d]:/t %ld/n", i, pIfRow->dwAdminStatus);
  241.             printf("/tOper Status[%d]:/t ", i);
  242.             switch (pIfRow->dwOperStatus) {
  243.             case IF_OPER_STATUS_NON_OPERATIONAL:
  244.                 printf("Non Operational/n");
  245.                 break;
  246.             case IF_OPER_STATUS_UNREACHABLE:
  247.                 printf("Unreasonable/n");
  248.                 break;
  249.             case IF_OPER_STATUS_DISCONNECTED:
  250.                 printf("Disconnected/n");
  251.                 break;
  252.             case IF_OPER_STATUS_CONNECTING:
  253.                 printf("Connecting/n");
  254.                 break;
  255.             case IF_OPER_STATUS_CONNECTED:
  256.                 printf("Connected/n");
  257.                 break;
  258.             case IF_OPER_STATUS_OPERATIONAL:
  259.                 printf("Operational/n");
  260.                 break;
  261.             default:
  262.                 printf("Unknown status %ld/n", pIfRow->dwAdminStatus);
  263.                 break;
  264.             }
  265.             printf("/n");
  266.         }
  267.     } else {
  268.         printf("GetIfTable failed with error: /n", dwRetVal);
  269.         if (pIfTable != NULL) {
  270.             FREE(pIfTable);
  271.             pIfTable = NULL;
  272.         }  
  273.         return 1;
  274.         // Here you can use FormatMessage to find out why 
  275.         // it failed.
  276.     }
  277.     if (pIfTable != NULL) {
  278.         FREE(pIfTable);
  279.         pIfTable = NULL;
  280.     }
  281.     //GetInterfaceInfo 
  282.     //
  283.     //TODO:
  284.     return 0;
  285. }
  286. int _tmain(int argc, _TCHAR* argv[])
  287. {
  288.     IpConfigAll();
  289.     return 0;
  290. }
件简介: IPHelper是一款帮助您快速设置IP地址、网关、DNS及IE代理服务器等相关设置的绿色免费软件, 特别适合移动办公用户和需要经常在不同网段间切换的用户使用。作者最早开发此软件时是为了满足 自身的更改IP的需要,随后在网络上众多用户给予了肯定、支持和帮助,4年多来IPHelper经过的不断 改进,操作更加便利,功能不断完善,希望它能给更多的用户带来便利! 更新日志: IPHelper5.2 - 增加了修改计算机名称及执行自定义命令等功能。修正了部分bug,增进界面友好性。(2008/12) IPHelper4.6 - 增加了“生成快捷方式”功能,大大提高了部分常用配置的切换速度。软件可以 最小化到任务栏,并快速切换配置。修正了部分bug,增进界面友好性。(2007/01) IPHelper4.2 - 改用xml配置文件存放历史配置;增加多IP多DNS设置;增加IE代理服务器设置; 增强了操作性。(2006/07) IPHelper3.5 - 增加网络连通情况测试。调整了界面结构,增加界面友好性。(2005/03) IPHelper3.3 - 增加了自动备份功能;增加了小图标显示功能(右键菜单内选择);修正了多 DNS会自动退出的Bug。(2004/11) IPHelper3.1 - 加强了界面友好度,可以更改配置名称。添加了DNS修改功能。(2004/03) IPHelper2.6 - 加强了对多网卡的支持,对性能进行了优化,添加了新版本提示功能。(2003/08) IPHelper2.1 - 第一个发布版本,小巧实用的特性得到了网友们的肯定。(2002/11) 联系方式: Web: http://www.4w5w.com/soft/ E-Mail: www@4w5w.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值