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
结构体的一些主要成员:
-
dwIndex
: 一个DWORD
类型的值,表示接口的索引号。这个索引号是唯一的,用于标识系统中的每个网络接口。 -
wszName
: 一个宽字符串(WCHAR
数组),包含接口的名称。例如,它可能是 “本地连接” 或 “无线网络连接”。 -
dwType
: 一个DWORD
类型的值,表示接口的类型,定义了接口的物理和网络层,例如以太网、令牌环、FDDI 等。 -
dwMtu
: 一个DWORD
类型的值,表示最大传输单元(MTU),即接口可以处理的最大数据包大小。 -
dwSpeed
: 一个DWORD
类型的值,表示接口的传输速率,单位通常是bps(比特每秒)。 -
dwPhysAddrLen
: 一个DWORD
类型的值,表示物理地址(如MAC地址)的长度。 -
bPhysAddr
: 一个字节数组,包含接口的物理地址,如Ethernet的MAC地址。 -
dwAdminStatus
: 一个DWORD
类型的值,表示接口的管理员状态,表示是否启用。 -
dwOperStatus
: 一个DWORD
类型的值,表示接口的操作状态,例如运行中、停止或正在初始化。 -
dwLastChange
: 一个DWORD
类型的值,表示自上次状态改变以来的时间,接口状态最后一次变化的时间,单位是秒。 -
dwInOctets
: 一个DWORD
类型的值,表示接收到的字节总数。 -
dwInUcastPkts
: 一个DWORD
类型的值,表示接收到的单播数据包总数。 -
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
结构
包含以下关键字段:
-
dwForwardDest
:目标网络的 IP 地址。 -
dwForwardMask
:目标网络的子网掩码。 -
dwForwardPolicy
:路由策略。目前这个字段不被使用,必须设置为0。 -
dwForwardNextHop
:下一跳的 IP 地址。 -
dwForwardIfIndex
:下一跳接口的索引。 -
dwForwardType
:路由类型,例如直接路由、间接路由等。 -
dwForwardProto
:路由协议,例如静态路由、RIP、OSPF等。 -
dwForwardAge
:路由条目的年龄,通常由系统维护。 -
dwForwardNextHopAS
:下一跳的自治系统号,用于 BGP 路由。 -
dwForwardMetric1
:路由的度量值,用于决定路由的成本。 -
dwForwardMetric2
、dwForwardMetric3
、dwForwardMetric4
、dwForwardMetric5
:额外的度量值,用于不同的路由协议。
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
:路由的度量值,用于决定路由的成本。dwForwardMetric2
、dwForwardMetric3
、dwForwardMetric4
、dwForwardMetric5
:额外的度量值,用于不同的路由协议。
函数行为
- 创建路由:如果路由表中不存在指定的路由条目,
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 统计信息,主要功能包括:
- 设置 IP 转发(
ipForwarding
):控制 IP 数据包是否可以在网络接口之间转发。目前仅支持从“开启(ON)”切换到“关闭(OFF)”。 - 设置默认的 TTL(Time To Live)值:TTL 是 IP 数据包的生存时间,用于限制数据包在网络中的跳数,防止数据包无限循环。
参数解释
PMIB_IPSTATS pIpStats
:- 类型:
PMIB_IPSTATS
是指向MIB_IPSTATS
结构的指针。 - 作用:该结构包含需要修改的 IP 统计信息字段。
- 如果只想修改其中一个字段(
ipForwarding
或dwDefaultTTL
),而另一个字段需要保持当前值,则需要将另一个字段设置为特定的值: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_TTL
和 MIB_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;
}
注意事项
- 权限要求:修改默认 TTL 值通常需要管理员权限。如果没有足够的权限,调用该函数可能会失败。
- 系统限制:某些操作系统或网络配置可能会限制对 TTL 值的修改。在某些情况下,即使调用成功,实际的 TTL 值可能也不会改变。
- TTL 的作用:TTL 值的设置会影响网络中的数据包传输。较低的 TTL 值可能会导致数据包在到达目的地之前就被丢弃,而较高的 TTL 值可能会导致数据包在网络中传播得更远。因此,设置 TTL 值时需要谨慎。
总结
SetIpTTL
是一个简单的函数,用于设置系统中发送的 IP 数据报的默认 TTL 值。它接受一个无符号整数作为参数,并返回一个表示成功或失败的错误码。在使用时需要注意权限和系统限制。