WindowsAPI| Iphlpapi.h网络配置相关文档详细分析一

简介

Iphlpapi.h 是 Windows 平台的一个头文件,它提供了网络诊断和网络配置相关的函数。这个头文件定义了 Windows IP Helper API,其中包括许多用于获取网络配置信息、管理网络连接和执行网络诊断的函数。

例如,使用 Iphlpapi.h 可以执行以下操作:

  • 获取网络适配器的列表和状态。
  • 获取网络接口的统计信息(如发送和接收的数据包数)。
  • 管理网络路由表。
  • 执行网络诊断测试,如 ping 或 traceroute。

如果你正在开发一个需要这些功能的 Windows 应用程序,你可以在你的代码中包含这个头文件,并使用它定义的函数。

这里是一个简单的例子,展示如何使用 Iphlpapi.h 来获取网络适配器的信息:

#include <windows.h>
#include <iphlpapi.h>
#include <stdio.h>

int main() {
    ULONG outBufLen = 0;
    IP_ADAPTER_INFO *pAdapterInfo;

    // 首先调用GetAdaptersInfo以确定需要的缓冲区大小
    DWORD dwRetVal = GetAdaptersInfo(NULL, &outBufLen);
    if (dwRetVal == ERROR_BUFFER_OVERFLOW) {
        pAdapterInfo = (IP_ADAPTER_INFO *)malloc(outBufLen);
        if(pAdapterInfo == NULL) {
            printf("Memory allocation failed for IP_ADAPTER_INFO.\n");
            return 1;
        }
    }

    // 再次调用GetAdaptersInfo以获取网络适配器信息
    dwRetVal = GetAdaptersInfo(pAdapterInfo, &outBufLen);
    if (dwRetVal == NO_ERROR) {
        // 输出网络适配器信息
        for (pAdapterInfo; pAdapterInfo != NULL; pAdapterInfo = pAdapterInfo->Next) {
            printf("\tAdapter name: %s\n", pAdapterInfo->AdapterName);
            printf("\tAdapter description: %s\n", pAdapterInfo->Description);
            printf("\tAdapter address: ");
            for (int i = 0; i < pAdapterInfo->AddressLength; i++) {
                printf("%02X ", pAdapterInfo->Address[i]);
            }
            printf("\n");
        }
    } else {
        printf("Call to GetAdaptersInfo failed.\n");
    }

    // 释放内存
    free(pAdapterInfo);
    return 0;
}

这段代码首先调用 GetAdaptersInfo 函数来确定需要的缓冲区大小,然后分配内存并再次调用该函数来获取网络适配器的信息。最后,它遍历链表并打印每个适配器的名称、描述和地址。

详解

路径

iphlpapi.h 是 Windows 操作系统中用于网络诊断和配置的一组 API 的头文件。它包含在 Windows SDK 中,通常位于以下路径:

C:\Program Files (x86)\Windows Kits\10\Include\10.0.*\um\iphlpapi.h

这里的 10.0.* 可能会根据你安装的 Windows SDK 版本而有所不同。你可以通过 Windows SDK 安装目录找到相应的头文件。如果你的系统上安装了 Visual Studio 或其他开发工具,它们通常会包含这些 SDK 文件。

头文件的开头部分

/*++

Copyright (c) Microsoft Corporation. All rights reserved.

Module Name:

    iphlpapi.h

Abstract:
    Header file for functions to interact with the IP Stack for MIB-II and
    related functionality

--*/

#ifndef __IPHLPAPI_H__
#define __IPHLPAPI_H__

#if _MSC_VER > 1000
#pragma once
#endif
#include <winapifamily.h>

这段代码是 iphlpapi.h 头文件的开头部分。它包含了几个关键部分:

  1. 版权声明:声明了 Microsoft Corporation 对该文件拥有版权。
  2. 模块名称:指出了文件名 iphlpapi.h
  3. 摘要:简要描述了这个头文件的作用,即提供与 IP 堆栈交互的函数,用于 MIB-II(管理信息库版本 2)和相关功能的实现。

接下来是一些预处理指令:

  • #ifndef IPHLPAPI_H:这是一个预处理指令,用于防止头文件被多次包含。它检查是否已经定义了 __IPHLAPI_H__,如果没有定义,则继续包含文件的内容。
  • #define IPHLPAPI_H:定义了 __IPHLAPI_H__,确保这个头文件的内容只会被包含一次。
  • #if _MSC_VER > 1000:这是一个条件编译指令,用于检查使用的编译器版本。_MSC_VER 是 Microsoft Visual C++ 编译器的版本号。如果版本号大于 1000(即 Visual Studio .NET 2002 或更高版本),则执行 #pragma once
  • #pragma once:这是一个非标准的编译器指令,告诉编译器这个文件只包含一次。它在 Visual Studio 中有效,但不是所有编译器都支持。
  • #include <winapifamily.h>:包含 Windows API 家族定义的头文件。这个文件定义了不同的 Windows 平台和 API 可用性。

这些指令和包含确保了头文件在编译时被正确处理,并且只包含一次。这对于避免编译错误和确保代码的一致性非常重要。

可移植性和兼容性

//
//                                                                          //
// Establish DLL function linkage if supported by the current build         //
// environment and not previously defined.                                  //
//                                                                          //
//

#ifndef IPHLPAPI_DLL_LINKAGE
#ifdef DECLSPEC_IMPORT
#define IPHLPAPI_DLL_LINKAGE DECLSPEC_IMPORT
#else
#define IPHLPAPI_DLL_LINKAGE
#endif
#endif

#pragma region Application Family or OneCore Family or Games Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)

#ifdef __cplusplus
extern "C" {
#endif

这段代码是 C/C++ 编程中常见的宏定义和编译器指令,用于在 Windows 平台上处理 DLL(动态链接库)的函数链接,以及确保代码在不同 Windows API 家族间的兼容性。下面是对这些代码的具体解释:

  1. 条件编译:通过一系列宏定义来确定是否需要为 DLL 函数导出或导入,这取决于编译器是否支持 DECLSPEC_IMPORT(用于指定导入符号)。

    #ifndef IPHLPAPI_DLL_LINKAGE
    #ifdef DECLSPEC_IMPORT
    #define IPHLPAPI_DLL_LINKAGE DECLSPEC_IMPORT
    #else
    #define IPHLPAPI_DLL_LINKAGE
    #endif
    #endif
    
    • #ifndef IPHLPAPI_DLL_LINKAGE 检查是否已经定义了 IPHLPAPI_DLL_LINKAGE
    • #ifdef DECLSPEC_IMPORT 检查编译器是否定义了 DECLSPEC_IMPORT(通常由编译器自动定义,例如,当你在创建 DLL 时作为导出项目编译)。
    • 如果 DECLSPEC_IMPORT 可用,则 IPHLPAPI_DLL_LINKAGE 被定义为 DECLSPEC_IMPORT,这将导入 DLL 中的函数。
    • 如果 DECLSPEC_IMPORT 不可用,则 IPHLPAPI_DLL_LINKAGE 被定义为空,这意味着没有特定的链接属性。
  2. Windows API 家族分区:使用 WINAPI_PARTITION 宏来确定代码应该在哪些 Windows API 家族中可用。

    #pragma region Application Family or OneCore Family or Games Family
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)
    
    • #pragma region 是一个编译器指令,用于标识一个代码区域的开始。在这个例子中,它被用来标识与特定 Windows API 家族相关的代码区域。
    • WINAPI_FAMILY_PARTITION 宏用于在编译时确定是否应该包含这段代码。这里,它检查是否应该为应用程序家族(WINAPI_PARTITION_APP)、系统家族(WINAPI_PARTITION_SYSTEM)或游戏家族(WINAPI_PARTITION_GAMES)编译这段代码。
  3. C++ 外部链接符号:当在 C++ 项目中使用 C 风格的函数时,需要使用 extern "C" 来确保链接符号的正确性。

    #ifdef __cplusplus
    extern "C" {
    #endif
    
    • #ifdef __cplusplus 检查是否在 C++ 环境中编译代码。
    • extern "C" 指示编译器接下来的函数应该使用 C 语言的链接规则,这对于 C/C++ 混编非常重要,因为它允许 C++ 编译器正确链接 C 函数。

这些代码段是构建跨平台 Windows 应用程序时常见的做法,确保了代码的可移植性和兼容性。

设置和获取网络信息的 MIB

//
//                                                                          //
// IPRTRMIB.H has the definitions of the structures used to set and get     //
// information                                                              //
//                                                                          //
//

#include <iprtrmib.h>
#include <ipexport.h>
#include <iptypes.h>
#include <tcpestats.h>

#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */
#pragma endregion

#pragma region Desktop Family or OneCore Family or Games Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)

这段代码继续说明了一些 C/C++ 编程概念,特别是在 Windows 平台开发中使用的一些技术和宏。下面是对这段代码的详细解释:

  1. 文件用途注释:注释首先指明了这个文件包含用于设置和获取网络信息的 MIB(Management Information Base)结构的定义。

  2. 包含其他头文件

    • #include <iprtrmib.h>:包含了定义 MIB-II 管理信息结构的头文件。
    • #include <ipexport.h>:包含了 IP 相关函数的导出声明。
    • #include <iptypes.h>:包含了 IP 地址相关的类型和常量定义。
    • #include <tcpestats.h>:包含了 TCP 统计信息的结构定义。
  3. 结束平台分区宏定义

    • #endif /* WINAPI_FAMILY_PARTITION(...) */:这部分代码是结束之前 #if#ifdef 语句的条件编译块,确保只有当编译环境符合指定的 Windows 平台家族时才包含这部分代码。
  4. 结束区域定义指令

    • #pragma endregion:指示编译器结束当前定义的区域。
  5. 开始新的平台分区宏定义

    • #pragma region Desktop Family or OneCore Family or Games Family:定义了一个新的代码区域,并命名它为与桌面、OneCore 或游戏相关的家族。
    • #if WINAPI_FAMILY_PARTITION(...):使用 WINAPI_FAMILY_PARTITION 宏来包含适用于桌面、系统或游戏家族的代码,这是 Windows 8 引入的用于编译特定平台代码的方法。

这段代码是典型的 Windows SDK 编程风格,使用宏和预处理指令来控制不同版本的 Windows 平台之间的代码。这种方式允许开发者编写可在多个 Windows 平台上运行的代码,同时确保了对特定平台特性的支持。

GetNumberOfInterfaces:检索系统中网络接口的数量

//
//                                                                          //
// The GetXXXTable APIs take a buffer and a size of buffer.  If the buffer  //
// is not large enough, the APIs return ERROR_INSUFFICIENT_BUFFER  and      //
// *pdwSize is the required buffer size                                     //
// The bOrder is a BOOLEAN, which if TRUE sorts the table according to      //
// MIB-II (RFC XXXX)                                                        //
//                                                                          //
//


//
//                                                                          //
// Retrieves the number of interfaces in the system. These include LAN and  //
// WAN interfaces                                                           //
//                                                                          //
//

IPHLPAPI_DLL_LINKAGE
DWORD
WINAPI
GetNumberOfInterfaces(
    _Out_ PDWORD  pdwNumIf
    );

这段注释和函数声明是Windows网络编程中的一部分,说明了如何使用API来获取系统中网络接口的数量。这里是对代码段的解释:

  1. 注释部分

    • 第一个注释块描述了 GetXXXTable 系列API的通用行为。这些API需要一个缓冲区和缓冲区大小作为参数。如果提供缓冲区不够大,API将返回 ERROR_INSUFFICIENT_BUFFER 错误,并设置 *pdwSize 为所需的缓冲区大小。
    • 第二个注释块提到了 bOrder 参数,这是一个布尔值,如果设为 TRUE,则会根据MIB-II标准(RFC XXXX,这里的 XXXX 可能是特定RFC文档的编号)对表格进行排序。
  2. 函数声明

    • 声明了 GetNumberOfInterfaces 函数,该函数是 iphlpapi.dll 库中的一个导出函数,用于检索系统中网络接口的数量,包括本地局域网(LAN)和广域网(WAN)接口。
  3. 函数细节

    • IPHLPAPI_DLL_LINKAGE 是一个链接指示符,指定了这个函数是DLL的一部分。
    • DWORD WINAPI GetNumberOfInterfaces(_Out_ PDWORD pdwNumIf); 这行声明了一个函数,其返回类型是 DWORD 类型,这是Windows API中常用的一个无符号32位整型,用于表示函数的错误代码或返回值。
    • _Out_ PDWORD pdwNumIf 是该函数的参数,_Out_ 指的是输出参数,PDWORD 是指向 DWORD 的指针,pdwNumIf 将会存储系统中网络接口的数量。

使用这个函数时,你会提供一个 DWORD 类型的指针,函数会将系统中网络接口的数量写入这个指针指向的内存地址。如果调用成功,返回值将为 ERROR_SUCCESS(通常定义为0),表示没有错误发生。如果返回值不是0,则表示调用失败,可以通过查阅相应的错误代码来确定失败的原因。

GetIfEntry:获取特定网络接口的 MIB-II ifEntry 信息

//
//                                                                          //
// Gets the MIB-II ifEntry                                                  //
// The dwIndex field of the MIB_IFROW should be set to the index of the     //
// interface being queried                                                  //
//                                                                          //
//

IPHLPAPI_DLL_LINKAGE
DWORD
WINAPI
GetIfEntry(
    _Inout_ PMIB_IFROW   pIfRow
    );

这段注释和函数声明描述了如何使用 Windows 平台的 IP Helper API 来获取特定网络接口的 MIB-II ifEntry 信息。

  1. 注释部分

    • 注释说明了 GetIfEntry 函数的用途,即获取特定网络接口的 MIB-II ifEntry 信息。MIB-II 是一个网络管理的标准,ifEntry 是其中的一个部分,代表网络接口的相关信息。
    • 指出 MIB_IFROW 结构体的 dwIndex 字段需要被设置为查询的接口的索引。这个索引通常是从1开始的,代表系统中的第一个网络接口。
  2. 函数声明

    • GetIfEntry 函数是 iphlpapi.dll 库中的一个导出函数,用于获取特定网络接口的详细信息。
    • IPHLPAPI_DLL_LINKAGE 是一个宏,用于指示该函数是 DLL 的一部分,确保正确的导出和导入。
  3. 函数参数

    • _Inout_ PMIB_IFROW pIfRowGetIfEntry 函数的参数,其中:
      • _Inout_ 是 SAL(Source Annotation Language)注解,表示这个参数既被读取也被修改。
      • PMIB_IFROW 是指向 MIB_IFROW 结构体的指针,MIB_IFROW 包含了网络接口的详细信息。
      • pIfRow 是这个指针的变量名,它指向一个已经初始化了 dwIndex 字段的结构体实例。
  4. 函数返回值

    • 函数返回一个 DWORD 类型的值,表示操作的结果。如果操作成功,返回 ERROR_SUCCESS(值通常为0)。如果操作失败,返回值将是一个错误代码,可以通过查阅 Windows API 文档来获取具体的错误信息。

使用 GetIfEntry 函数时,你需要先初始化一个 MIB_IFROW 结构体,设置其 dwIndex 字段为你想查询的网络接口的索引。然后,将这个结构体的地址传递给 GetIfEntry 函数。如果调用成功,MIB_IFROW 结构体将被填充,包含所查询接口的详细信息,如接口的索引、名称、类型、物理地址、操作状态等。

GetIfTable:获取MIB-II的接口表(IfTable)这个表包含了系统中所有网络接口的信息

//
//                                                                          //
// Gets the MIB-II IfTable                                                  //
//                                                                          //
//

IPHLPAPI_DLL_LINKAGE
DWORD
WINAPI
GetIfTable(
    _Out_writes_bytes_opt_(*pdwSize) PMIB_IFTABLE pIfTable,
    _Inout_                    PULONG       pdwSize,
    _In_                       BOOL         bOrder
    );

这段代码是Windows网络管理API的一部分,它定义了如何获取MIB-II IfTable的函数声明。下面是对这段代码的解释:

  1. 注释部分

    • 描述了 GetIfTable 函数的作用,即获取MIB-II的接口表(IfTable)。这个表包含了系统中所有网络接口的信息。
  2. 函数声明

    • GetIfTableiphlpapi.dll 库中的一个导出函数,用于检索系统中所有网络接口的列表。
  3. 函数参数

    • _Out_writes_bytes_opt_(*pdwSize) PMIB_IFTABLE pIfTable:这是一个输出参数,指向 MIB_IFTABLE 结构的指针。MIB_IFTABLE 结构包含了一个 MIB_IFROW 结构的数组,每个 MIB_IFROW 包含了一个接口的信息。_Out_writes_bytes_opt_(*pdwSize) 表示这个参数的大小由 pdwSize 参数指定,并且如果 pdwSize 为0,则这个参数可以是 NULL
    • _Inout_ PULONG pdwSize:这是一个输入输出参数,指向一个 ULONG 值的指针。在调用函数之前,这个值应该设置为 pIfTable 缓冲区的大小。如果缓冲区不够大,函数会设置这个值为所需的大小,并返回 ERROR_INSUFFICIENT_BUFFER 错误。
    • _In BOOL bOrder:这是一个输入参数,布尔值。如果设置为 TRUE,则返回的接口表将按照MIB-II标准排序。
  4. 返回值

    • 函数返回一个 DWORD 类型的值,表示操作的状态。如果调用成功,返回 ERROR_SUCCESS(值为0)。如果调用失败,返回其他错误代码。

使用这个函数时,你需要提供一个足够大的缓冲区来存储接口表,或者先传入一个空的缓冲区(NULL),并设置 pdwSize 为0,以获取所需的缓冲区大小。然后根据返回的大小分配缓冲区,并再次调用函数以获取接口表。

MIB_IFROW 包含了网络接口的详细信息都有什么?

MIB_IFROW 是一个结构体,它包含了单个网络接口的详细信息。在Windows的网络管理API中,它用于通过 GetIfEntry 函数获取特定网络接口的状态和统计信息。以下是 MIB_IFROW 结构体通常包含的成员:

  1. dwIndex: 一个 DWORD 类型的值,表示接口的索引号。这个索引号是唯一的,用于标识系统中的每个网络接口。

  2. wszName: 一个宽字符串(WCHAR 数组),包含接口的名称。例如,它可能是 “本地连接” 或 “无线网络连接”。

  3. dwType: 一个 DWORD 类型的值,表示接口的类型,定义了接口的物理和网络层,例如以太网、令牌环、FDDI等。

  4. dwMtu: 一个 DWORD 类型的值,表示最大传输单元(MTU),即接口可以处理的最大数据包大小。

  5. dwSpeed: 一个 DWORD 类型的值,表示接口的传输速率,单位通常是bps(比特每秒)。

  6. dwPhysAddrLen: 一个 DWORD 类型的值,表示物理地址(如MAC地址)的长度。

  7. bPhysAddr: 一个字节数组,包含接口的物理地址,如Ethernet的MAC地址。

  8. dwAdminStatus: 一个 DWORD 类型的值,表示接口的管理员状态,表示是否启用。

  9. dwOperStatus / dwOperationalStatus: 一个 DWORD 类型的值,表示接口的操作状态,例如运行中、停止或正在初始化。

  10. dwLastChange: 一个 DWORD 类型的值,表示自上次状态改变以来的时间,接口状态最后一次变化的时间,单位是秒。

  11. dwInOctets: 一个 DWORD 类型的值,表示接收到的字节总数。

  12. dwInUcastPkts: 一个 DWORD 类型的值,表示接收到的单播数据包总数。

  13. dwInNUcastPkts: 一个 DWORD 类型的值,表示接收到的非单播(多播或广播)数据包总数。

  14. dwInDiscards: 一个 DWORD 类型的值,表示因各种错误而被丢弃的数据包总数。

  15. dwInErrors: 一个 DWORD 类型的值,表示接收到的错误数据包总数。

  16. dwInUnknownProtos: 一个 DWORD 类型的值,表示接收到的未知协议数据包总数。

  17. dwOutOctets: 一个 DWORD 类型的值,表示发送的字节总数。

  18. dwOutUcastPkts: 一个 DWORD 类型的值,表示发送的单播数据包总数。

  19. dwOutNUcastPkts: 一个 DWORD 类型的值,表示发送的非单播数据包总数。

  20. dwOutDiscards: 一个 DWORD 类型的值,表示因各种错误而被丢弃的发送数据包总数。

  21. dwOutErrors: 一个 DWORD 类型的值,表示发送时出现错误的数据包总数。

  22. dwOutQLen: 一个 DWORD 类型的值,表示输出队列的长度。

  23. dwDescrLen: 接口描述的长度(如果有)。

  24. bDescr: 接口的描述信息,如果有。

这些成员提供了网络接口的全面视图,包括其名称、类型、状态、速率、地址、统计信息等。这些信息对于网络管理和故障排除非常重要。
请注意,不同的Windows版本和编译环境可能会有细微差别,上述字段是标准的 MIB_IFROW 结构体中常见的成员。使用这个结构体的应用程序可以查询网络接口的当前状态和统计数据,用于诊断和监控网络功能。

GetIpAddrTable:获取系统中所有网络接口的IP地址映射表

//
//                                                                          //
// Gets the Interface to IP Address mapping                                 //
//                                                                          //
//

IPHLPAPI_DLL_LINKAGE
DWORD
WINAPI
GetIpAddrTable(
    _Out_writes_bytes_opt_(*pdwSize)    PMIB_IPADDRTABLE pIpAddrTable,
    _Inout_                       PULONG           pdwSize,
    _In_                          BOOL             bOrder
    );

这段代码是一个函数声明,它属于Windows网络管理API,用于获取系统中所有网络接口的IP地址映射表。下面是对这段代码的详细解释:

  1. 注释部分

    • 描述了 GetIpAddrTable 函数的作用,即获取网络接口到IP地址的映射信息。
  2. 函数声明

    • GetIpAddrTableiphlpapi.dll 库中的一个导出函数,用于检索系统中所有网络接口的IP地址信息。
  3. 参数说明

    • pIpAddrTable: 这是一个指向 MIB_IPADDRTABLE 结构的指针,该结构将被函数填充,包含每个接口的IP地址信息。使用 _Out_writes_bytes_opt_(*pdwSize) 属性,表示这个参数是输出缓冲区,其大小由 *pdwSize 确定。如果缓冲区太小,函数将返回所需的缓冲区大小。
    • pdwSize: 一个 ULONG 类型的指针,代表 pIpAddrTable 缓冲区的大小。在调用函数之前,应设置为缓冲区的大小。如果调用返回 ERROR_INSUFFICIENT_BUFFER*pdwSize 将被更新为所需的缓冲区大小。
    • bOrder: 一个布尔值参数。如果设置为 TRUE,IP地址表将按照某种顺序排序;如果为 FALSE,IP地址表将按照接口的索引顺序排列。
  4. 返回值

    • 函数返回一个 DWORD 类型的值,表示调用的结果。如果返回值为 ERROR_SUCCESS(通常是0),则表示调用成功,并且 pIpAddrTable 被成功填充。如果返回其他错误代码,表示调用失败。
  5. 使用场景

    • 此函数通常用于网络管理应用程序,用以获取系统中所有网络接口的IP地址列表,例如进行网络配置、诊断或监控。
  6. 注意事项

    • 在第一次调用 GetIpAddrTable 之前,你需要分配一个足够大的缓冲区来存储IP地址表,并设置 *pdwSize 为该缓冲区的大小。如果函数返回 ERROR_INSUFFICIENT_BUFFER,你需要根据 *pdwSize 更新的值重新分配一个更大的缓冲区,并再次调用函数。

MIB_IPADDRTABLE 结构体通常包含一个或多个 MIB_IPADDRROW 结构体的数组,每个 MIB_IPADDRROW 结构体代表一个接口的IP地址信息,包括IP地址、子网掩码、相关接口的索引等。

MIB_IPADDRROW 结构体

MIB_IPADDRROW 结构体用于存储Windows系统中特定IPv4地址的详细信息,其定义在 Windows 平台的网络管理API中。以下是该结构体的一些主要成员:

  • dwAddr: 以网络字节顺序排列的IPv4地址。
  • dwIndex: 与此IPv4地址关联的接口索引。这个索引是唯一的,用于标识一个网络接口。在Windows XP及更高版本上,这个成员的数据类型是 IF_INDEX
  • dwMask: 以网络字节顺序排列的IPv4地址的子网掩码。
  • dwBCastAddr: 以网络字节顺序排列的广播地址。广播地址通常是将IP地址的主机部分全部置为1的地址。但请注意,GetIpAddrTable 函数并不返回此成员的正确值。
  • dwReasmSize: 表示在该实体上重组IP数据报分片的最大长度。
  • unused1: 在Windows XP及更高版本上,这个成员是未使用的。
  • wType: 此字段在Windows XP及更高版本上可用,用于指定IP地址的类型。

MIB_IPADDRROW 结构体通常用于与 GetIpAddrTable 函数一起工作,该函数检索本地计算机上的接口到IPv4地址映射表,并在 MIB_IPADDRTABLE 结构中返回此信息。MIB_IPADDRTABLE 结构中的 table 成员是一个 MIB_IPADDRROW 项数组。

在Windows 2000及更早的版本中,dwIndex 成员的类型可能不是 IF_INDEX,并且 wType 成员可能被定义为“未使用2”。此外,在Windows Vista及更高版本的SDK中,MIB_IPADDRROW 结构在 Ipmib.h 头文件中定义,而不是 Iprtrmib.h 头文件中定义。但是,Ipmib.h 头文件会自动包含在 Iphlpapi.h 头文件中的 Iprtrmib.h 中,因此开发人员不应直接使用 Ipmib.hIprtrmib.h 头文件。

这些信息是直接从 Microsoft Learn 文档和博客文章中提取的,提供了对 MIB_IPADDRROW 结构体的详细描述及其在网络编程中的使用情况。

GetIpNetTable:获取当前的IP地址到物理地址(即ARP表)的映射信息

//
//                                                                          //
// Gets the current IP Address to Physical Address (ARP) mapping            //
//                                                                          //
//

IPHLPAPI_DLL_LINKAGE
ULONG
WINAPI
GetIpNetTable(
    _Out_writes_bytes_opt_(*SizePointer) PMIB_IPNETTABLE IpNetTable,
    _Inout_                        PULONG          SizePointer,
    _In_                           BOOL            Order
    );

这段代码是一个Windows网络管理API函数 GetIpNetTable 的声明,它用于获取当前的IP地址到物理地址(即ARP表)的映射信息。以下是对代码的解释:

  • 注释说明

  • 注释部分说明了 GetIpNetTable 函数的作用:获取当前的IP地址到物理地址(ARP表)的映射。

  • 函数声明

  • GetIpNetTableiphlpapi.dll 库中的一个导出函数,用于检索本地计算机上的IP网络表,即ARP表,其中包括IP地址到物理(MAC)地址的映射。

  • 参数描述

  • IpNetTable: 这是一个 PMIB_IPNETTABLE 类型的指针,指向一个结构体,该结构将被函数填充,包含IP地址到物理地址的映射信息。使用 _Out_writes_bytes_opt_(*SizePointer) 属性,表示这个参数是输出参数,其大小由 *SizePointer 字段确定。

  • SizePointer: 指向 ULONG 类型的指针,表示 IpNetTable 缓冲区的大小。调用函数之前,它应该被初始化为缓冲区的大小,如果函数返回 ERROR_INSUFFICIENT_BUFFER,它将被设置为所需的缓冲区大小。

  • Order: 布尔值参数,指定是否需要对返回的表进行排序。这个参数在 GetIpNetTable 函数中的作用可能与其它函数中的排序参数有所不同,具体作用可能依赖于实现和文档。

  • 返回值

  • 函数返回 ULONG 类型值,表示函数调用的结果。如果返回 NO_ERROR(通常是0),表示调用成功,并且 IpNetTable 被填充了有效的数据。其他任何非零值表示调用失败。

  • 使用场景

  • 此函数常用于网络诊断工具或网络管理应用程序,用以获取本机的ARP表信息,了解IP地址与物理地址的映射关系。

  • 注意事项

  • 与其它缓冲区相关的API一样,在使用 GetIpNetTable 之前,你需要分配一个足够大的缓冲区,并在调用前设置 SizePointer。如果缓冲区太小,API会返回 ERROR_INSUFFICIENT_BUFFER,此时需要根据 *SizePointer 指定的新大小重新分配缓冲区,并再次调用函数。
    请注意,实际的 GetIpNetTable 函数原型可能与这里提供的注释有所不同,具体实现和行为应参考最新的Windows SDK文档。

MIB_IPNETTABLE 结构体

MIB_IPNETTABLE 结构体是 Windows 网络管理 API 的一部分,用于存储 IP 地址到物理(MAC)地址的映射信息,也就是通常所说的 ARP 表。以下是 MIB_IPNETTABLE 结构体的一般定义和成员:

typedef struct _MIB_IPNETTABLE {
    DWORD dwNumEntries;
    MIB_IPNETROW table[ANY_SIZE]; // 一个指向MIB_IPNETROW结构数组的指针
} MIB_IPNETTABLE, *PMIB_IPNETTABLE;

成员说明:

  • dwNumEntries: 一个 DWORD 类型的值,表示 table 数组中的条目数量,即系统中有多少个IP到物理地址的映射。

  • table: 一个 MIB_IPNETROW 结构体数组,每个数组元素包含了一个特定的 IP 地址到物理地址的映射信息。ANY_SIZE 是一个宏,表示数组可以有任意大小,实际大小由 dwNumEntries 成员指定。

MIB_IPNETROW 结构体是 MIB_IPNETTABLE 结构体数组中的元素类型,它通常包含以下字段:

typedef struct _MIB_IPNETROW {
    DWORD dwIndex;           // 接口索引
    DWORD dwPhysAddrLen;    // 物理地址长度,通常为MAC地址长度
    BYTE  bPhysAddr[8];     // 物理地址,即MAC地址
    DWORD dwAddr;           // IP地址
    DWORD dwType;           // 行类型,例如动态、静态等
} MIB_IPNETROW, *PMIB_IPNETROW;

成员说明:

  • dwIndex: 一个 DWORD 类型的值,表示与此物理地址关联的网络接口的索引。
  • dwPhysAddrLen: 一个 DWORD 类型的值,表示 bPhysAddr 数组的长度,通常是6,对应于标准的MAC地址长度。
  • bPhysAddr: 一个8字节的字节数组,存储了物理地址(例如,以太网的MAC地址)。
  • dwAddr: 一个 DWORD 类型的值,表示与物理地址关联的IP地址。
  • dwType: 一个 DWORD 类型的值,表示映射的类型,例如静态ARP条目或动态ARP条目。

使用 GetIpNetTable 函数可以填充 MIB_IPNETTABLE 结构体,从而获取当前的 ARP 表信息。这在网络诊断和配置中非常有用。

每个 MIB_IPNETROW 结构包含了接口索引、IP地址、物理(MAC)地址等信息。具体的字段可能会根据 Windows 版本的不同而有所变化。

GetIpForwardTable:获取当前的IP路由表

//
//                                                                          //
// Gets the IP Routing Table  (RFX XXXX)                                    //
//                                                                          //
//

IPHLPAPI_DLL_LINKAGE
DWORD
WINAPI
GetIpForwardTable(
    _Out_writes_bytes_opt_(*pdwSize)    PMIB_IPFORWARDTABLE pIpForwardTable,
    _Inout_                       PULONG              pdwSize,
    _In_                          BOOL                bOrder
    );

这段代码是Windows网络管理API中的GetIpForwardTable函数的函数原型,用于获取当前的IP路由表。以下是对这段代码和函数的解释:

  1. 注释部分

    • 注释说明了GetIpForwardTable函数的作用:获取IP路由表信息。
  2. 函数声明

    • GetIpForwardTableiphlpapi.dll库中的导出函数,用于检索本机的IP路由表。
  3. 参数描述

    • pIpForwardTable: 这是一个指向MIB_IPFORWARDTABLE结构的指针,该结构将被函数填充,包含IP路由表的信息。使用_Out_writes_bytes_opt_(*pdwSize)属性,表示这个参数是输出缓冲区,其大小由*pdwSize字段确定。
    • pdwSize: 指向ULONG类型的指针,表示pIpForwardTable缓冲区的大小。在调用函数之前,它应该被初始化为缓冲区的大小,如果函数返回ERROR_INSUFFICIENT_BUFFER,它将被设置为所需的缓冲区大小。
    • bOrder: 布尔值参数,用于指定函数返回的路由表是否按目的网络地址排序。如果 bOrder 为 TRUE,则路由表将被排序。
  4. 返回值

    • 函数返回DWORD类型的值,表示函数调用的结果。如果返回值为NO_ERROR(通常是0),表示调用成功,并且pIpForwardTable被填充了有效的数据。其他任何值表示调用失败。
  5. 使用场景

    • 此函数通常用于需要获取IP路由表信息的情况,如网络监控、故障排除或路由策略分析。
  6. 注意事项

    • 在调用GetIpForwardTable之前,你需要分配一个足够大的缓冲区来存储路由表,并在调用前设置pdwSize。如果缓冲区太小,API会返回ERROR_INSUFFICIENT_BUFFER,此时需要根据*pdwSize指定的新大小重新分配缓冲区,并再次调用函数。

MIB_IPFORWARDTABLE结构体通常包含以下字段:

  • dwNumEntries: 表中的条目数。
  • table: 包含MIB_IPFORWARDROW结构的数组,每个数组元素代表一个特定的路由。

每个MIB_IPFORWARDROW结构包含了目的网络、网关、子网掩码、接口索引等信息。具体的字段可能会根据Windows版本的不同而有所变化。使用这个函数可以帮助了解数据包是如何在你的网络或通过你的网络路由的。

MIB_IPFORWARDTABLE 结构体

MIB_IPFORWARDTABLE 结构体在 Windows 网络管理 API 中用于表示 IP 路由表。这个结构体包含了一系列的路由项,每个路由项定义了如何到达特定的网络目的地。路由表中的每一条记录通常包含了目的网络、掩码、下一跳地址、接口指标等信息。以下是 MIB_IPFORWARDTABLE 结构体的一般定义和成员:

typedef struct _MIB_IPFORWARDTABLE {
    DWORD                          dwNumEntries;
    MIB_IPFORWARDROW               table[ANY_SIZE];
} MIB_IPFORWARDTABLE, *PMIB_IPFORWARDTABLE;

成员说明:

  • dwNumEntries: 一个 DWORD 类型的值,表示路由表中 MIB_IPFORWARDROW 结构的数量,即表中的路由条目总数。

  • table: 一个可变大小的数组, MIB_IPFORWARDROW 结构体数组,每个元素包含单个路由项的详细信息。ANY_SIZE 是一个宏,表示数组可以有任意大小,实际大小由 dwNumEntries 成员指定。

MIB_IPFORWARDROW 结构体是 MIB_IPFORWARDTABLE 结构体数组中的元素类型,它通常包含以下字段:

typedef struct _MIB_IPFORWARDROW {
    DWORD          dwForwardDest;     // 目的IP地址
    DWORD          dwForwardMask;     // 目的网络的子网掩码
    DWORD          dwForwardPolicy;   // 路由策略(Windows XP 及以后版本中使用)
    DWORD          dwForwardNextHop;  // 下一跳IP地址
    DWORD          dwForwardIfIndex;  // 此路由使用的接口索引
    DWORD          dwForwardType;     // 路由类型(如常规、特殊等)
    DWORD          dwForwardProto;    // 路由协议(如自动、手动、OSPF、RIP等)
    DWORD          dwForwardAge;      // 自从此条目最后一次更新以来的时间(秒)
    DWORD          dwForwardNextHopAS; // 下一跳的自治系统号(Windows XP 及以后版本中使用)
    DWORD          dwForwardMetric1;  // 路由的度量值1
    DWORD          dwForwardMetric2;  // 路由的度量值2
    DWORD          dwForwardMetric3;  // 路由的度量值3
    DWORD          dwForwardMetric4;  // 路由的度量值4
    DWORD          dwForwardMetric5;  // 路由的度量值5
} MIB_IPFORWARDROW, *PMIB_IPFORWARDROW;

成员说明:

  • dwForwardDest: 目的IP地址,表示路由项所对应的目标网络或主机地址。
  • dwForwardMask: 目的网络的子网掩码,用来确定目的地址的哪些部分用于匹配目的网络。
  • dwForwardPolicy: 路由策略字段,通常未使用。
  • dwForwardNextHop: 下一跳IP地址,数据包将被发送到这个地址以到达目的地。
  • dwForwardIfIndex: 此路由使用的接口索引,用于标识数据包将通过的网络接口。
  • dwForwardType: 路由类型,例如 MIB_IPROUTE_TYPE_INDIRECT(间接路由)或 MIB_IPROUTE_TYPE_DIRECT(直接路由)。
  • dwForwardProto: 定义此路由的协议,例如 MIB_IPPROTO_OTHERMIB_IPPROTO_LOCALMIB_IPPROTO_NETMGMT 等。
  • dwForwardAge: 自从此条目最后一次更新以来的时间,以秒为单位。
  • dwForwardNextHopAS: 下一跳的自治系统号,如果适用。
  • dwForwardMetric1dwForwardMetric5: 路由的度量值,这些值用于路由选择过程,具体含义取决于所使用的路由协议。

使用 GetIpForwardTable 函数可以填充 MIB_IPFORWARDTABLE 结构体,从而获取当前的 IP 路由表信息。这对于网络管理和故障排除非常有用。

  • 26
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
iphlpapi.h和iphlpapi.lib是Windows操作系统提供的两个重要文件,它们包含了一些网络编程中常用的API函数和库函数。 iphlpapi.h是一个头文件,是Windows系统提供的用于网络编程的接口函数的声明文件。它定义了一些能够获取和管理网络信息的函数和数据结构,如获取本机IP地址、获取网络接口信息、获取路由表等。在进行网络编程时,我们可以包含这个头文件,并使用其中定义的函数和结构体来完成相关的操作。要使用这个头文件,我们需要在编译时将其包含在我们的代码中。 iphlpapi.lib是一个库文件,包含了对应于iphlpapi.h中声明的函数的实现。在进行网络编程时,我们需要链接这个库文件,以便在运行时能够正确调用到其中的函数。通过引入这个库文件,我们就可以使用其所提供的函数来进行网络编程了。要使用这个库文件,我们需要在链接时将其与我们的代码进行链接。 要下载iphlpapi.h和iphlpapi.lib,我们需要在开发环境中安装Windows SDK或Visual Studio等相关开发工具。在安装过程中,我们可以选择安装对应的开发组件或工具集。安装好相应的开发工具之后,我们就可以在系统中找到这两个文件了。我们可以在SDK安装目录的Include文件夹下找到iphlpapi.h,并在Lib文件夹下找到iphlpapi.lib。 总之,iphlpapi.h和iphlpapi.lib是进行网络编程所需的两个重要文件,其中.h文件是用于声明接口函数的头文件,.lib文件是用于存储函数实现的库文件。要下载这两个文件,我们需要安装相应的开发工具,并从相应的安装目录中找到这两个文件进行使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奇树谦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值