设为首页 收藏本站
云服务器等爆品抢先购,低至4.2元/月
查看: 1509|回复: 0

[经验分享] windows主机网络信息获取程序设计

[复制链接]

尚未签到

发表于 2017-6-28 15:46:54 | 显示全部楼层 |阅读模式
  掌握windows系统获取网络信息的各种API函数的功能与调用方法,掌握设计程序显示获取到相关网络信息的方法,掌握网络字节数据与主机字节数据之间的转换。掌握这些API函数调用的错误处理方法。
  利用本地网络信息开发接口IP Helper API编写主机网络信息获取程序依实现获取网络的配置信息、管理网络适配器和获取相关信息、管理网络接口和获取相关信息、获取IP和ICMP中的信息、管理路由信息和获取arp信息、接收TCP和UDP信息等的目的。
  1.使用ipconfig获取本地网络信息
  在cmd中使用ipconfig命令获取网络信息,结果见最后贴图
  2.利用IP Helper API获取本地网络适配器信息
  编写获取本地网络信息的程序,代码如下:
  #include"stdafx.h"
  #pragmacomment(lib, "IPHLPAPI.lib")
  #include<winsock2.h>
  #include<iphlpapi.h>
  #include<stdio.h>
  int _tmain(int argc, _TCHAR* argv[])
  {
  // 指定获取到的网络信息结构体链表的指针
  IP_ADAPTER_INFO *pAdapterInfo;
  // 保存获取到的网络信息结构体链表的长度
  ULONG  ulOutBufLen;
  // 返回调用编码
  DWORD dwRetVal;
  // 在轮循所有网络适配器信息时使用的单个结构体变量
  PIP_ADAPTER_INFO pAdapter;
  // 为pAdapterInfo分配空间
  pAdapterInfo = (IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO));
  ulOutBufLen = sizeof(IP_ADAPTER_INFO);
  // 第1次调用GetAdaptersInfo(),获取返回结果的大小到ulOutBufLen中
  if(GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) != ERROR_SUCCESS)
  {
  free(pAdapterInfo);
  pAdapterInfo = (IP_ADAPTER_INFO *)malloc(ulOutBufLen);
  }
  // 第2次调用GetAdaptersInfo(),获取本地网络信息到结构体pAdapterInfo中
  if((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) != ERROR_SUCCESS)
  {
  printf("GetAdaptersInfo Error! %d\n", dwRetVal);
  }
  // 从pAdapterInfo 获取并显示本地网络信息
  pAdapter = pAdapterInfo;
  while(pAdapter)
  {
  printf("网络适配器名: \t\t%s\n", pAdapter->AdapterName);
  printf("网络适配器描述: \t%s\n\n", pAdapter->Description);
  printf("MAC地址: \t\t");
  for(int i=0; i<pAdapter->AddressLength; i++)
  {
  if(i==(pAdapter->AddressLength -1))
  printf("%.2X\n", (int)pAdapter->Address);
  else
  printf("%.2X-", (int)pAdapter->Address);
  }
  printf("IP地址: \t\t%s\n", pAdapter->IpAddressList.IpAddress.String);
  printf("子网掩码: \t\t%s\n", pAdapter->IpAddressList.IpMask.String);
  printf("网关: \t\t\t%s\n", pAdapter->GatewayList.IpAddress.String);
  printf("********************************************************************\n");
  if(pAdapter->DhcpEnabled)
  {
  printf("启用DHCP: \t\t是\n");
  printf("DHCP服务器: \t\t%s\n", pAdapter->DhcpServer.IpAddress.String);
  }
  else
  {
  printf("启用DHCP: \t\t否\n");
  }
  // 处理下一人网络适配器
  pAdapter = pAdapter->Next;
  }
  // 释放资源
  if(pAdapterInfo)
  free(pAdapterInfo);
  
  printf("\n\n");
  system("pause");   
  return 0;
  }
  程序运行结果见最后贴图
  3.获取本地主机名、域名和DNS服务器信息:
  编写获取本地网络参数的信息的程序,代码如下:
  #include"stdafx.h"
  #include<winsock2.h>
  #include<iphlpapi.h>
  #include<stdio.h>
  #pragmacomment(lib, "IPHLPAPI.lib")
  int_tmain(intargc, _TCHAR* argv[])
  {        
  // 定义保存本地计算机网络参数信息的结构体指针
  FIXED_INFO * FixedInfo;
  // 保存获取到的本地计算机网络参数信息结构体链表的长度
  ULONG    ulOutBufLen;
  // 调用GetNetworkParams()函数的返回值
  DWORD    dwRetVal;
  // 保存所有DNS服务器的IP地址列表
  IP_ADDR_STRING * pIPAddr;
  // 为FixedInfo结构体分配内存空间
  FixedInfo = (FIXED_INFO *) GlobalAlloc( GPTR, sizeof( FIXED_INFO ) );
  // 初始化ulOutBufLen变量值
  ulOutBufLen = sizeof( FIXED_INFO );
  // 第1次调用GetNetworkParams()函数,获取返回结果的大小到ulOutBufLen中
  if( ERROR_BUFFER_OVERFLOW == GetNetworkParams( FixedInfo, &ulOutBufLen ) ) {
  GlobalFree( FixedInfo );
  FixedInfo = (FIXED_INFO *) GlobalAlloc( GPTR, ulOutBufLen );
  }
  // 第2次调用GetNetworkParams()函数,以前面获取的ulOutBufLen作为参数,
  if ( dwRetVal = GetNetworkParams( FixedInfo, &ulOutBufLen ) != ERROR_SUCCESS) {
  printf( "调用GetNetworkParams()函数失败。返回值: %08x\n", dwRetVal );
  }
  else {
  printf( "主机名: %s\n", FixedInfo->HostName );
  printf( "域名: %s\n", FixedInfo->DomainName );
  
  printf("\n==========网络信息==========\n");
  // 生成节点类型字符串
  char* NodeType;
  switch(FixedInfo->NodeType)
  {
  caseBROADCAST_NODETYPE:   
  NodeType="Broadcase Node";
  break;
  casePEER_TO_PEER_NODETYPE:
  NodeType="Peer to Peer Node";
  break;
  caseMIXED_NODETYPE:        
  NodeType="Mixed Node";
  break;
  caseHYBRID_NODETYPE:      
  NodeType="Hybrid Node";
  break;
  default:                    
  NodeType="Unknown Node";
  break;
  }
  printf("节点类型...................:%d - %s\n", FixedInfo->NodeType, NodeType);
  printf("是否启用路由功能...........:%s\n", (FixedInfo->EnableRouting != 0) ? "是" : "否");
  printf("是否启用ARP代理功能........:%s\n", (FixedInfo->EnableProxy != 0) ? "是" : "否");
  printf("是否启用DNS服务器..........:%s\n", (FixedInfo->EnableDns != 0) ? "是" : "否");
  printf( "\nDNS服务器列表:\n" );
  printf( "%s\n", FixedInfo->DnsServerList.IpAddress.String );
  pIPAddr = FixedInfo->DnsServerList.Next;
  while ( pIPAddr ) {
  printf( "\t%s\n", pIPAddr->IpAddress.String );
  pIPAddr = pIPAddr->Next;
  }
  }
  printf("\n\n");
  system("pause");   
  return 0;
  }
  程序运行结果见最后贴图
  4.获取本地计算机网络接口的基本信息
  编写使用IP Helper API获取本地网络接口信息的程序,代码如下:
  #include"stdafx.h"
  #include<winsock2.h>
  #include<iphlpapi.h>
  #include<stdio.h>
  #pragmacomment(lib, "iphlpapi.lib")
  // 分配内存空间
  #define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
  // 释放内存空间
  #define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
  int _tmain(int argc, _TCHAR* argv[])
  {
  // 保存网络接口信息的结构体指针
  PIP_INTERFACE_INFO pInfo;
  // 保存获取数据的长度
  ULONG ulOutBufLen = 0;
  // 返回结果
  DWORD dwRetVal = 0;
  // _tmain()函数的返回结果
  int iReturn = 1;
  // 第1次调用 GetInterfaceInfo,获取数据大小,保存到ulOutBufLen变量中
  dwRetVal = GetInterfaceInfo(NULL, &ulOutBufLen);
  if (dwRetVal == ERROR_INSUFFICIENT_BUFFER) {
  pInfo = (IP_INTERFACE_INFO *) MALLOC(ulOutBufLen);
  if (pInfo == NULL) {
  printf("无法分配GetInterfaceInfo函数需要的内存空间。\n");
  return 1;
  }
  }
  // 第2次调用GetInterfaceInfo函数,获取需要的实际数据
  dwRetVal = GetInterfaceInfo(pInfo, &ulOutBufLen);
  if (dwRetVal == NO_ERROR) {
  printf("网络适配器数量: %ld\n\n", pInfo->NumAdapters);
  for (int i = 0; i < (int) pInfo->NumAdapters; i++) {
  printf("网络适配器索引[%d]: %ld\n", i,
  pInfo->Adapter.Index);
  printf("网络适配器名称[%d]: %ws\n\n", i,
  pInfo->Adapter.Name);
  }
  iReturn = 0;
  } elseif (dwRetVal == ERROR_NO_DATA) {
  printf
  ("本地计算机上没有支持IPv4的网络适配器。\n");
  iReturn = 0;
  } else {
  printf("GetInterfaceInfo调用失败: %d\n", dwRetVal);
  iReturn = 1;
  }
  // 释放内存空间
  FREE(pInfo);
  // 按任意键继续
  system("pause");
  return (iReturn);
  }
  程序运行结果见最后贴图
  5.获取本地计算机IP地址表
  编写程序调用GetIPAddrTable()函数获取本地计算机网络接口和IP地址映射表,程序代码如下:
  #include"stdafx.h"
  #include<winsock2.h>
  #include<iphlpapi.h>
  #include<stdio.h>
  #pragmacomment(lib, "iphlpapi.lib")
  #pragmacomment(lib, "ws2_32.lib")
  #define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
  #define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
  int _tmain(int argc, _TCHAR* argv[])
  {
  int i;
  // 网络接口与IP地址映射表
  PMIB_IPADDRTABLE pIPAddrTable;
  // 获取数据的大小
  DWORD dwSize = 0;
  // 调用GetIPAddrTable()函数的返回值
  DWORD dwRetVal = 0;
  // 保存IP地址的结构体
  IN_ADDR IPAddr;
  // 用于获取错误信息
  LPVOID lpMsgBuf;
  // 分配内存空间
  pIPAddrTable = (MIB_IPADDRTABLE *) MALLOC(sizeof (MIB_IPADDRTABLE));
  // 第1次调用GetIpAddrTable()函数,获取数据的大小到dwSize
  if (pIPAddrTable) {
  if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) ==
  ERROR_INSUFFICIENT_BUFFER) {
  FREE(pIPAddrTable);
  pIPAddrTable = (MIB_IPADDRTABLE *) MALLOC(dwSize);
  }
  if (pIPAddrTable == NULL) {
  printf("GetIpAddrTable()函数内存分配失败\n");
  exit(1);
  }
  }
  // 第2次调用GetIpAddrTable()函数,获取实际数据
  if ( (dwRetVal = GetIpAddrTable( pIPAddrTable, &dwSize, 0 )) != NO_ERROR ) {
  printf("GetIpAddrTable()调用失败: %d\n", dwRetVal);
  if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),       // Default language
  (LPTSTR) & lpMsgBuf, 0, NULL)) {
  printf("\t错误信息: %s", lpMsgBuf);
  LocalFree(lpMsgBuf);
  }
  exit(1);
  }
  printf("\t记录数量: %ld\n", pIPAddrTable->dwNumEntries);
  for (i=0; i < (int) pIPAddrTable->dwNumEntries; i++) {
  printf("\n\t接口序号[%d]:\t%ld\n", i, pIPAddrTable->table.dwIndex);
  IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table.dwAddr;
  printf("\tIP地址[%d]:     \t%s\n", i, inet_ntoa(IPAddr) );
  IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table.dwMask;
  printf("\t子网掩码[%d]:    \t%s\n", i, inet_ntoa(IPAddr) );
  IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table.dwBCastAddr;
  printf("\t广播地址[%d]:      \t%s (%ld%)\n", i, inet_ntoa(IPAddr), pIPAddrTable->table.dwBCastAddr);
  printf("\t重组报文最大数量[%d]:\t%ld\n", i, pIPAddrTable->table.dwReasmSize);
  printf("\t类型和状态[%d]:", i);
  if (pIPAddrTable->table.wType & MIB_IPADDR_PRIMARY)
  printf("\t主IP地址");
  if (pIPAddrTable->table.wType & MIB_IPADDR_DYNAMIC)
  printf("\t动态IP地址");
  if (pIPAddrTable->table.wType & MIB_IPADDR_DISCONNECTED)
  printf("\t断开连接的接口对应的IP地址");
  if (pIPAddrTable->table.wType & MIB_IPADDR_DELETED)
  printf("\t删除的IP地址");
  if (pIPAddrTable->table.wType & MIB_IPADDR_TRANSIENT)
  printf("\t临时地址");
  printf("\n");
  }
  if (pIPAddrTable) {
  FREE(pIPAddrTable);
  pIPAddrTable = NULL;
  }
  printf("\n");
  system("pause");
  return 0;
  }
  程序运行结果见最后贴图
  运行结果
  1.使用ipconfig获取本地网络信息
DSC0000.png

  2.利用IP Helper API获取本地网络适配器信息
DSC0001.png

  3.获取本地网络参数的信息的程序
DSC0002.png

  4.使用IP Helper API获取本地网络接口信息的程序
DSC0003.png

  5.调用GetIPAddrTable()函数获取本地计算机网络接口和IP地址映射表
DSC0004.png

  由于win32窗口程序界面完全显示数据条目比较难实现的关系,采用控制台程序的方式设计,虽然能够完成显示,但是还有待改进。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-389059-1-1.html 上篇帖子: c和c++在windows下获取时间和计算时间差的方法总结 下篇帖子: windows配置caffe及matlab/python接口编译和调用(cpu/gpu)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表