windows主机网络信息获取程序设计
掌握windows系统获取网络信息的各种API函数的功能与调用方法,掌握设计程序显示获取到相关网络信息的方法,掌握网络字节数据与主机字节数据之间的转换。掌握这些API函数调用的错误处理方法。
利用本地网络信息开发接口IP Helper API编写主机网络信息获取程序依实现获取网络的配置信息、管理网络适配器和获取相关信息、管理网络接口和获取相关信息、获取IP和ICMP中的信息、管理路由信息和获取arp信息、接收TCP和UDP信息等的目的。
1.使用ipconfig获取本地网络信息
在cmd中使用ipconfig命令获取网络信息,结果见最后贴图
2.利用IP Helper API获取本地网络适配器信息
编写获取本地网络信息的程序,代码如下:
#include
"stdafx.h"
#pragma
comment(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[i]);
else
printf("%.2X-", (int)pAdapter->Address[i]);
}
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>
#pragma
comment(lib, "IPHLPAPI.lib")
int
_tmain(int
argc, _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)
{
case
BROADCAST_NODETYPE:
NodeType="Broadcase Node";
break;
case
PEER_TO_PEER_NODETYPE:
NodeType="Peer to Peer Node";
break;
case
MIXED_NODETYPE:
NodeType="Mixed Node";
break;
case
HYBRID_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>
#pragma
comment(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[i].Index);
printf("网络适配器名称[%d]: %ws\n\n", i,
pInfo->Adapter[i].Name);
}
iReturn = 0;
} else
if (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>
#pragma
comment(lib, "iphlpapi.lib")
#pragma
comment(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[i].dwIndex);
IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwAddr;
printf("\tIP地址[%d]: \t%s\n", i, inet_ntoa(IPAddr) );
IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwMask;
printf("\t子网掩码[%d]: \t%s\n", i, inet_ntoa(IPAddr) );
IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwBCastAddr;
printf("\t广播地址[%d]: \t%s (%ld%)\n", i, inet_ntoa(IPAddr), pIPAddrTable->table[i].dwBCastAddr);
printf("\t重组报文最大数量[%d]:\t%ld\n", i, pIPAddrTable->table[i].dwReasmSize);
printf("\t类型和状态[%d]:", i);
if (pIPAddrTable->table[i].wType & MIB_IPADDR_PRIMARY)
printf("\t主IP地址");
if (pIPAddrTable->table[i].wType & MIB_IPADDR_DYNAMIC)
printf("\t动态IP地址");
if (pIPAddrTable->table[i].wType & MIB_IPADDR_DISCONNECTED)
printf("\t断开连接的接口对应的IP地址");
if (pIPAddrTable->table[i].wType & MIB_IPADDR_DELETED)
printf("\t删除的IP地址");
if (pIPAddrTable->table[i].wType & MIB_IPADDR_TRANSIENT)
printf("\t临时地址");
printf("\n");
}
if (pIPAddrTable) {
FREE(pIPAddrTable);
pIPAddrTable = NULL;
}
printf("\n");
system("pause");
return 0;
}
程序运行结果见最后贴图
运行结果
1.使用ipconfig获取本地网络信息

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

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

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

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

由于win32窗口程序界面完全显示数据条目比较难实现的关系,采用控制台程序的方式设计,虽然能够完成显示,但是还有待改进。
windows主机网络信息获取程序设计的更多相关文章
- Qt-获取主机网络信息之QHostInfo
Qt中提供了几个用于获取主机网络信息的类,包括QHostInfo.QHostAddress.QNetworkInterface以及QNetworkAddress.在本节中,我将在这里总结QHostIn ...
- c/c++ 网络编程 UDP 用if_nameindex和ioctl取得主机网络信息
网络编程 UDP 用if_nameindex和ioctl取得主机网络信息 getifaddrs函数取得的东西太多了,如果只想取得网卡名字和网卡编号可以用下面的2个函数. 1,if_nameindex ...
- c/c++ 网络编程 UDP 主机网络信息取得
网络编程 UDP 主机网络信息取得 1,if_nametoindex 通过网卡名字取得网卡编号 2,if_indextoname 通过网卡编号取得网卡名字 #include <stdio.h&g ...
- Qt-获取主机网络信息之QNetworkInterface
QNetworkInterface类提供了一个主机IP地址和网络接口的列表. QNetworkInterface表示了当前程序正在运行时与主机绑定的一个网络接口.每个网络接口可能包含0个或者多个IP地 ...
- Qt-获取主机网络信息之QHostAddress
QHostAddress类提供一个IP地址. 这个类提供一种独立于平台和协议的方式来保存IPv4和IPv6地址. QHostAddress通常与QTcpSocket,QTcpServer,QUdpSo ...
- Qt-获取主机网络信息之QNetworkAddressEntry
QNetworkAddressEntry类存储了一个网络接口所支持的一个IP地址,同时还有与之相关的子网掩码和广播地址. 每个网络接口可以包含0个或多个IP地址,这些IP地址可以分别关联一个子网掩码和 ...
- Windows主机与centOS虚拟机之间"ping不通"
为什么要遇到这个问题 这是我重新安装centOS7.5虚拟机之后遇到的问题——我需要安装一个SecureCRT工具,结果主机与虚拟机没有ping通. 在安装这个工具之前需要进行主机与虚拟机的相互pin ...
- 重新想象 Windows 8 Store Apps (60) - 通信: 获取网络信息, 序列化和反序列化
[源码下载] 重新想象 Windows 8 Store Apps (60) - 通信: 获取网络信息, 序列化和反序列化 作者:webabcd 介绍重新想象 Windows 8 Store Apps ...
- 获取主机信息,网络信息AIP,getsockname,getpeername,getservbyname,getservbyport,inet_ntop,inet_pton
获取主机信息 1.ip地址转换,主机字节序 <---> 网络字节序 #include <arpa/inet.h> int inet_pton(int af, const cha ...
随机推荐
- 预处理函数在app和蓝图级别的不同使用
app级别 from flask import Flask from flask_sqlalchemy import SQLAlchemy # SQLAlchemy 类实例对象的创建一定要在引用蓝图之 ...
- Get Requests with Json Data && Get Requests with Url Parameters
- spring boot 使用application.properties 进行外部配置
application.properties大家都不陌生,我们在开发的时候,经常使用它来配置一些可以手动修改而且不用编译的变量,这样的作用在于,打成war包或者jar用于生产环境时,我们可以手动修改环 ...
- zookeeper集群环境搭建详细图文教程
zookeeper集群环境搭建详细图文教程 zhoubang @ 2018-01-02 [文档大纲] 友情介绍 软件环境 注意点 环境安装 1. 新建用于存储安装包以及软件安装的目录 2. 下载安装z ...
- springmvc 简单框架
1.依赖 2.web.xml配置: 3.springmvc配置文件: 4.Controller 5.index.jsp页面: 6.hello.jsp 7.效果:
- Python小白学习之路(二)—【Pycharm安装与配置】【创建项目】【运算符】【数据类型】
写在前面: 第二天的学习,感觉比昨天学习相对轻松一些,但是对于我这个编程语言功底很弱的人来说,还是稍稍微有些.....哈尔滨的天气一天天冷了下来,还飘着小雨,不过还是挺有意境的.充实而又忙碌的生活,让 ...
- Swift 中@available 和 #available
Swift 2.0 中,引入了可用性的概念.对于函数,类,协议等,可以使用@available声明这些类型的生命周期依赖于特定的平台和操作系统版本.而#available用在判断语句中(if, gua ...
- Anaconda 入门详解
Anaconda Anaconda简介 Anaconda是一个免费开源的Python和R语言的发行版本,用于计算科学(数据科学.机器学习.大数据处理和预测分析),Anaconda致力于简化包管理和部署 ...
- 【数组】Rotate Image
题目: You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwis ...
- 【原】Ubuntu13.04安装、卸载Gnome3.8
添加 GNOME 3 PPA(Personal Package Archives) 我们先给Ubuntu的Software Sources增加GNOME 3 PPA.这可以不用命令行就做到,但出于简单 ...