当前位置: 首页 > ds >正文

WindowsAPI|每天了解几个winAPI接口之网络配置相关文档Iphlpapi.h详细分析六

上一篇:WindowsAPI|每天了解几个winAPI接口之网络配置相关文档Iphlpapi.h详细分析五
如果有错误欢迎指正批评,在此只作为科普和参考。

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

文章目录

  • SetIfEntry:设置网络接口的条目
    • `MIB_IFROW` 结构体
  • CreateIpForwardEntry:在系统的路由表中创建一个新的路由条目
    • `MIB_IPFORWARDROW` 结构
  • SetIpForwardEntry:用于在系统的路由表中设置(创建、修改或删除)一个 IP 路由条目
    • `MIB_IPFORWARDROW` 结构的主要字段
  • DeleteIpForwardEntry:用于在系统的路由表中删除一个特定的 IP 路由条目
    • `MIB_IPFORWARDROW` 结构的主要字段
  • SetIpStatistics:修改 IP 统计信息
  • SetIpTTL:设置默认的 IP 数据报的生存时间

SetIfEntry:设置网络接口的条目

#pragma region Desktop Family or OneCore Family or Games Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)//////////////////////////////////////////////////////////////////////////////
//                                                                          //
// Used to set the ifAdminStatus on an interface.  The only fields of the   //
// MIB_IFROW that are relevant are the dwIndex (index of the interface      //
// whose status needs to be set) and the dwAdminStatus which can be either  //
// MIB_IF_ADMIN_STATUS_UP or MIB_IF_ADMIN_STATUS_DOWN                       //
//                                                                          //
//////////////////////////////////////////////////////////////////////////////IPHLPAPI_DLL_LINKAGE
DWORD
WINAPI
SetIfEntry(_In_ PMIB_IFROW pIfRow);

IPHLPAPI_DLL_LINKAGE 是一个宏,用于指定函数的链接方式。在这种情况下,它确保了函数可以从动态链接库(DLL)中正确链接。
DWORD WINAPI SetIfEntry(_In_ PMIB_IFROW pIfRow) 是函数声明。这个函数用于设置网络接口的条目。它的参数 pIfRow 是一个指向 MIB_IFROW 结构的指针,该结构包含了网络接口的信息。

  • _In_ 是一个指向输入参数的宏,表示该参数是函数的输入,不会被函数修改。
  • PMIB_IFROW 是指向 MIB_IFROW 结构的指针类型,MIB_IFROW 结构包含了网络接口的详细信息,如接口的索引(dwIndex)和管理员设置的状态(dwAdminStatus)。
  • dwAdminStatus 可以设置为 MIB_IF_ADMIN_STATUS_UP(启用接口)或 MIB_IF_ADMIN_STATUS_DOWN(禁用接口)。
  • SetIfEntry 函数返回一个 DWORD 类型的值,通常用于表示函数的执行结果。如果函数成功执行,返回值通常是 NO_ERROR(值为0)。如果函数执行失败,返回值是一个错误代码,可以用来诊断问题。

这段代码是网络管理编程中的一部分,用于控制网络接口的状态。在实际应用中,你需要确保拥有足够的权限来修改网络接口的状态,通常需要管理员权限。

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: 一个 DWORD 类型的值,表示接口的操作状态,例如运行中、停止或正在初始化。

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

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

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

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

这些信息对于网络管理员和网络诊断工具来说非常有用,因为它们提供了接口的详细状态和性能数据。通过分析这些数据,可以对网络接口的性能进行监控和故障排除。

CreateIpForwardEntry:在系统的路由表中创建一个新的路由条目

//////////////////////////////////////////////////////////////////////////////
//                                                                          //
// Used to create, modify or delete a route.  In all cases the              //
// dwForwardIfIndex, dwForwardDest, dwForwardMask, dwForwardNextHop and     //
// dwForwardPolicy MUST BE SPECIFIED. Currently dwForwardPolicy is unused   //
// and MUST BE 0.                                                           //
// For a set, the complete MIB_IPFORWARDROW structure must be specified     //
//                                                                          //
//////////////////////////////////////////////////////////////////////////////IPHLPAPI_DLL_LINKAGE
DWORD
WINAPI
CreateIpForwardEntry(_In_ PMIB_IPFORWARDROW pRoute);

用于创建、修改或删除路由。在所有情况下,必须指定格式、指数、屏蔽、格式和格式策略。
当前的转发策略未使用,并且必须为0。对于一个集合,必须指定完整的MIB_IPFORWARDROW结构。

CreateIpForwardEntry 函数是 Windows API 的一部分,用于在系统的路由表中创建一个新的路由条目。这个函数不仅可以创建新的路由,还可以修改现有的路由或删除路由,具体取决于提供的参数。

以下是函数声明中提到的一些关键点:

  • pRoute:这是一个指向 MIB_IPFORWARDROW 结构的指针,该结构包含了创建或修改路由所需的所有信息。

MIB_IPFORWARDROW 结构

包含以下关键字段:

  1. dwForwardDest:目标网络的 IP 地址。

  2. dwForwardMask:目标网络的子网掩码。

  3. dwForwardPolicy:路由策略。目前这个字段不被使用,必须设置为0。

  4. dwForwardNextHop:下一跳的 IP 地址。

  5. dwForwardIfIndex:下一跳接口的索引。

  6. dwForwardType:路由类型,例如直接路由、间接路由等。

  7. dwForwardProto:路由协议,例如静态路由、RIP、OSPF等。

  8. dwForwardAge:路由条目的年龄,通常由系统维护。

  9. dwForwardNextHopAS:下一跳的自治系统号,用于 BGP 路由。

  10. dwForwardMetric1:路由的度量值,用于决定路由的成本。

  11. dwForwardMetric2dwForwardMetric3dwForwardMetric4dwForwardMetric5:额外的度量值,用于不同的路由协议。

CreateIpForwardEntry 函数的返回值是一个 DWORD 类型的值,表示函数的执行结果。如果函数成功执行,返回值通常是 NO_ERROR(值为0)。如果函数执行失败,返回值是一个错误代码,这个错误代码可以用于诊断问题的原因。

请注意,修改系统的路由表是一个敏感操作,通常需要管理员权限。不正确的路由配置可能会导致网络连接问题,因此在执行这样的操作时需要谨慎。

SetIpForwardEntry:用于在系统的路由表中设置(创建、修改或删除)一个 IP 路由条目

IPHLPAPI_DLL_LINKAGE
DWORD
WINAPI
SetIpForwardEntry(_In_ PMIB_IPFORWARDROW pRoute);

SetIpForwardEntry 函数是 Windows API 的一部分,用于在系统的路由表中设置(创建、修改或删除)一个 IP 路由条目。这个函数提供了一种方法来动态地更改网络路由,这对于网络管理来说非常重要。
参数说明

  • pRoute:这是一个指向 MIB_IPFORWARDROW 结构的指针,该结构包含了完整的路由信息。这个结构体必须被完整地指定,包括目标网络地址、子网掩码、下一跳地址、接口索引等。

MIB_IPFORWARDROW 结构的主要字段

  • dwForwardDest:目标网络的 IP 地址。
  • dwForwardMask:目标网络的子网掩码。
  • dwForwardPolicy:路由策略。目前这个字段不被使用,必须设置为0。
  • dwForwardNextHop:下一跳的 IP 地址。
  • dwForwardIfIndex:下一跳接口的索引。
  • dwForwardType:路由类型,例如直接路由、间接路由等。
  • dwForwardProto:路由协议,例如静态路由、RIP、OSPF等。
  • dwForwardAge:路由条目的年龄,通常由系统维护。
  • dwForwardNextHopAS:下一跳的自治系统号,用于 BGP 路由。
  • dwForwardMetric1:路由的度量值,用于决定路由的成本。
  • dwForwardMetric2dwForwardMetric3dwForwardMetric4dwForwardMetric5:额外的度量值,用于不同的路由协议。

函数行为

  • 创建路由:如果路由表中不存在指定的路由条目,SetIpForwardEntry 将创建一个新的路由条目。
  • 修改路由:如果路由表中已存在指定的路由条目,SetIpForwardEntry 将更新该路由条目的信息。
  • 删除路由:如果 dwForwardPolicy 字段设置为0,并且 dwForwardNextHop 字段设置为0,SetIpForwardEntry 将删除指定的路由条目。

返回值

  • NO_ERROR(值为0):表示函数成功执行。
  • 错误代码:如果函数执行失败,返回值是一个错误代码,这个错误代码可以用于诊断问题的原因。

注意事项

  • 修改系统的路由表是一个敏感操作,通常需要管理员权限。
  • 不正确的路由配置可能会导致网络连接问题,因此在执行这样的操作时需要谨慎。

DeleteIpForwardEntry:用于在系统的路由表中删除一个特定的 IP 路由条目

IPHLPAPI_DLL_LINKAGE
DWORD
WINAPI
DeleteIpForwardEntry(_In_ PMIB_IPFORWARDROW pRoute);

DeleteIpForwardEntry 函数是 Windows API 的一部分,它用于在系统的路由表中删除一个特定的 IP 路由条目。这个函数对于网络管理员来说非常有用,因为它允许他们动态地修改网络的路由策略。

参数说明

  • pRoute:这是一个指向 MIB_IPFORWARDROW 结构的指针,该结构包含了要删除的路由条目的信息。至少需要指定 dwForwardDest(目标网络的 IP 地址)、dwForwardMask(目标网络的子网掩码)和 dwForwardPolicy(路由策略,虽然目前这个字段不被使用,必须设置为0)。

MIB_IPFORWARDROW 结构的主要字段

  • dwForwardDest:目标网络的 IP 地址。
  • dwForwardMask:目标网络的子网掩码。
  • dwForwardPolicy:路由策略。目前这个字段不被使用,必须设置为0。
  • dwForwardNextHop:下一跳的 IP 地址。
  • dwForwardIfIndex:下一跳接口的索引。
  • dwForwardType:路由类型,例如直接路由、间接路由等。
  • dwForwardProto:路由协议,例如静态路由、RIP、OSPF等。

函数行为

  • 当调用 DeleteIpForwardEntry 函数时,它会根据 pRoute 参数中提供的信息在路由表中查找匹配的路由条目。
  • 如果找到匹配的路由条目,该函数将从路由表中删除该条目。
  • 如果没有找到匹配的路由条目,函数将返回一个错误代码,表示没有找到要删除的路由。

返回值

  • NO_ERROR(值为0):表示函数成功执行,并且路由条目已被成功删除。
  • 错误代码:如果函数执行失败,返回值是一个错误代码,这个错误代码可以用于诊断问题的原因,例如没有找到匹配的路由条目。

注意事项

  • 删除路由表中的条目是一个敏感操作,通常需要管理员权限。
  • 在删除路由条目之前,确保该操作不会对网络的连通性产生负面影响。
  • 在执行这样的操作时,应该谨慎行事,以避免不必要的网络中断或配置错误。

SetIpStatistics:修改 IP 统计信息

//////////////////////////////////////////////////////////////////////////////
//                                                                          //
// Used to set the ipForwarding to ON or OFF (currently only ON->OFF is     //
// allowed) and to set the defaultTTL.  If only one of the fields needs to  //
// be modified and the other needs to be the same as before the other field //
// needs to be set to MIB_USE_CURRENT_TTL or MIB_USE_CURRENT_FORWARDING as  //
// the case may be                                                          //
// 																			//
//////////////////////////////////////////////////////////////////////////////#if (NTDDI_VERSION >= NTDDI_WIN2K)
IPHLPAPI_DLL_LINKAGE
DWORD
WINAPI
SetIpStatistics(_In_ PMIB_IPSTATS pIpStats);
#endif

这段代码是关于 SetIpStatistics 函数的声明和注释,它是一个 Windows 平台上的网络编程接口,用于修改 IP 统计信息。以下是对这段代码的翻译和解释:

翻译

//////////////////////////////////////////////////////////////////////////////
//                                                                          //
// 用于将 ipForwarding 设置为 ON 或 OFF(目前仅允许从 ON 切换到 OFF),
以及设置默认的 TTL(Time To Live)。如果只需要修改其中一个字段,
而另一个字段需要保持之前的值,
则另一个字段需要设置为 MIB_USE_CURRENT_TTL 或 MIB_USE_CURRENT_FORWARDING,
视具体情况而定。 
//                                                                          //
//////////////////////////////////////////////////////////////////////////////#if (NTDDI_VERSION >= NTDDI_WIN2K)
IPHLPAPI_DLL_LINKAGE
DWORD
WINAPI
SetIpStatistics(_In_ PMIB_IPSTATS pIpStats);
#endif

接口作用
SetIpStatistics 函数用于修改 IP 统计信息,主要功能包括:

  1. 设置 IP 转发(ipForwarding:控制 IP 数据包是否可以在网络接口之间转发。目前仅支持从“开启(ON)”切换到“关闭(OFF)”。
  2. 设置默认的 TTL(Time To Live)值:TTL 是 IP 数据包的生存时间,用于限制数据包在网络中的跳数,防止数据包无限循环。

参数解释

  • PMIB_IPSTATS pIpStats
    • 类型:PMIB_IPSTATS 是指向 MIB_IPSTATS 结构的指针。
    • 作用:该结构包含需要修改的 IP 统计信息字段。
    • 如果只想修改其中一个字段(ipForwardingdwDefaultTTL),而另一个字段需要保持当前值,则需要将另一个字段设置为特定的值:
      • MIB_USE_CURRENT_TTL:表示保持当前的默认 TTL 值。
      • MIB_USE_CURRENT_FORWARDING:表示保持当前的 IP 转发状态。

MIB_IPSTATS 结构
PMIB_IPSTATS 是指向 MIB_IPSTATS 结构的指针,MIB_IPSTATS 是一个结构体,而不是枚举值。以下是 MIB_IPSTATS 的典型定义(可能因 Windows 版本而略有不同):

typedef struct _MIB_IPSTATS {DWORD dwForwarding;       // IP 转发状态(0 表示 OFF,1 表示 ON)DWORD dwDefaultTTL;       // 默认的 TTL 值DWORD dwInReceives;       // 接收到的 IP 数据包总数DWORD dwInHdrErrors;      // 因头部错误而丢弃的数据包数DWORD dwInAddrErrors;     // 因地址错误而丢弃的数据包数DWORD dwForwDatagrams;    // 转发的数据包数DWORD dwInUnknownProtos;  // 因未知协议而丢弃的数据包数DWORD dwInDiscards;       // 因其他原因丢弃的输入数据包数DWORD dwInDelivers;       // 交付给上层协议的数据包数DWORD dwOutRequests;      // 发送的 IP 数据包总数DWORD dwOutDiscards;      // 因其他原因丢弃的输出数据包数DWORD dwOutNoRoutes;      // 因无路由而丢弃的数据包数DWORD dwReasmTimeout;     // 重组超时时间DWORD dwReasmReqds;       // 需要重组的数据包数DWORD dwReasmOks;         // 成功重组的数据包数DWORD dwReasmFails;       // 重组失败的数据包数DWORD dwFragOks;          // 成功分片的数据包数DWORD dwFragFails;        // 分片失败的数据包数DWORD dwFragCreates;      // 创建的分片数据包数
} MIB_IPSTATS, *PMIB_IPSTATS;

MIB_USE_CURRENT_TTLMIB_USE_CURRENT_FORWARDING

  • MIB_USE_CURRENT_TTL:这是一个特殊的值,通常定义为 -1,表示在调用 SetIpStatistics 时保持当前的默认 TTL 值不变。
  • MIB_USE_CURRENT_FORWARDING:同样是一个特殊的值,通常定义为 -1,表示保持当前的 IP 转发状态不变。

示例用法
以下是一个简单的示例,展示如何使用 SetIpStatistics 关闭 IP 转发并保持当前的默认 TTL 值:

#include <windows.h>
#include <iphlpapi.h>
#include <stdio.h>#pragma comment(lib, "iphlpapi.lib")int main() {MIB_IPSTATS ipStats;DWORD dwRetVal;// 获取当前的 IP 统计信息dwRetVal = GetIpStatistics(&ipStats);if (dwRetVal != NO_ERROR) {printf("GetIpStatistics failed with error: %d\n", dwRetVal);return 1;}// 修改 IP 转发状态为 OFF,并保持当前的默认 TTL 值ipStats.dwForwarding = 0; // 关闭 IP 转发ipStats.dwDefaultTTL = MIB_USE_CURRENT_TTL; // 保持当前的默认 TTL 值// 设置新的 IP 统计信息dwRetVal = SetIpStatistics(&ipStats);if (dwRetVal != NO_ERROR) {printf("SetIpStatistics failed with error: %d\n", dwRetVal);return 1;}printf("IP forwarding has been turned OFF.\n");return 0;
}

SetIpTTL:设置默认的 IP 数据报的生存时间

//////////////////////////////////////////////////////////////////////////////
//                                                                          //
// Used to set the defaultTTL.                                              //
//                                                                          //
//////////////////////////////////////////////////////////////////////////////IPHLPAPI_DLL_LINKAGE
DWORD
WINAPI
SetIpTTL(_In_ UINT nTTL);

这段代码定义了一个名为 SetIpTTL 的函数,它的作用是设置默认的 IP 数据报的生存时间(TTL,Time to Live)。以下是对这个函数的详细解释:

函数作用
SetIpTTL 用于全局设置系统中发送的 IP 数据报的默认 TTL 值。TTL 是一个 8 位字段,用于限制 IP 数据报在网络中的跳数(hop count),以防止数据报在网络中无限循环。每当数据报经过一个路由器时,TTL 值会减 1,当 TTL 值减到 0 时,数据报会被丢弃。

参数

  • _In_ UINT nTTL:这是一个输入参数,表示要设置的默认 TTL 值。它的范围通常是 1 到 255。常见的默认值是 64 或 128,具体取决于操作系统和网络配置。

返回值

  • 返回值是一个 DWORD 类型,表示函数的执行结果:
    • 如果函数成功,返回值为 NO_ERROR(通常是 0)。
    • 如果函数失败,返回值是一个错误码。例如:
      • ERROR_INVALID_PARAMETER:如果提供的 TTL 值无效(超出范围)。
      • ERROR_ACCESS_DENIED:如果调用者没有足够的权限来修改 TTL 值。

示例代码

以下是一个简单的示例,展示如何使用 SetIpTTL 函数设置默认的 TTL 值:

#include <windows.h>
#include <iphlpapi.h>
#pragma comment(lib, "iphlpapi.lib")int main() {UINT newTTL = 64; // 设置新的默认 TTL 值为 64DWORD result;// 调用 SetIpTTL 函数result = SetIpTTL(newTTL);if (result == NO_ERROR) {printf("Default TTL has been set to %u successfully.\n", newTTL);} else {printf("Failed to set default TTL. Error code: %u\n", result);}return 0;
}

注意事项

  1. 权限要求:修改默认 TTL 值通常需要管理员权限。如果没有足够的权限,调用该函数可能会失败。
  2. 系统限制:某些操作系统或网络配置可能会限制对 TTL 值的修改。在某些情况下,即使调用成功,实际的 TTL 值可能也不会改变。
  3. TTL 的作用:TTL 值的设置会影响网络中的数据包传输。较低的 TTL 值可能会导致数据包在到达目的地之前就被丢弃,而较高的 TTL 值可能会导致数据包在网络中传播得更远。因此,设置 TTL 值时需要谨慎。

总结
SetIpTTL 是一个简单的函数,用于设置系统中发送的 IP 数据报的默认 TTL 值。它接受一个无符号整数作为参数,并返回一个表示成功或失败的错误码。在使用时需要注意权限和系统限制。

http://www.xdnf.cn/news/16679.html

相关文章:

  • C++异常捕获:为何推荐按引用(by reference)捕获?
  • 华为昇腾芯片:多模态模型国产化的硬核突破
  • Ext JS极速项目之 Coworkee
  • ETH 交易流程深度技术详解
  • Linux进程概念(五)进程地址空间
  • 凸优化:凸函数的一些常用性质
  • 低成本嵌入式Linux开发方案:通过配置文件实现参数设置
  • 基于黑马教程——微服务架构解析(二):雪崩防护+分布式事务
  • 如何在 Ubuntu 24.04 或 22.04 Linux 上安装和使用 NoMachine
  • JavaScript 回调函数讲解_callback
  • 力扣7:整数反转
  • golang--通道和锁
  • 做了一款小而美的本地校验器
  • jimfs:Java内存文件系统,脱离磁盘IO瓶颈利器
  • 使用Docker在Rocky Linux 9.5上在线部署LangFlow
  • 【力扣热题100】哈希——两数之和
  • 基于深度学习的医学图像分析:使用3D CNN实现肿瘤检测
  • 智慧工地系统:科技赋能建筑新未来
  • 采用黑翅鸢优化算法BKA-CNN-LSTM、CNN-LSTM、LSTM、CNN四模型多变量回归预测,多输入单输出(Matlab)
  • nifi 访问Kerberos的kafka集群
  • 【行测】常识判断1
  • 图解系统的学习笔记--硬件结构
  • 【安卓笔记】OOM与内存优化
  • Sentinel 不同层面的流控保护
  • Ubuntu、pytorch、mamba安装
  • SD卡简介与驱动开发
  • kotlin基础【3】
  • C++模板元编程从入门到精通
  • Java设计模式-通俗举例
  • 项目上线中的跨域问题