ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

WSL 容器网络模式设置 API 详解:WslcSetContainerSettingsNetworkingMode 使用指南

WSL 容器网络模式设置 API 详解:WslcSetContainerSettingsNetworkingMode 使用指南 WSL 容器网络模式设置 API 详解WslcSetContainerSettingsNetworkingMode 使用指南【免费下载链接】WSLWindows Subsystem for Linux项目地址: https://gitcode.com/GitHub_Trending/ws/WSL本篇指南围绕 Windows Subsystem for LinuxWSL开源仓库中 WslcSDK 的 C 语言 APIWslcSetContainerSettingsNetworkingMode展开讲解如何以编程方式为 WSL 容器WSLC设置NONE隔离与BRIDGED桥接两种网络模式。读完本文你将掌握该 API 的完整签名、底层实现原理、与端口映射等配套 API 的配合方式以及基于仓库测试用例的行为约束从而在自己的 C/C 宿主程序中正确配置 WSL 容器的网络。本文主体内容对应仓库文档 wslcsetcontainersettingsnetworkingmode.md并结合 wslcsdk.cpp、wslcsdk.h 与 WslcSdkTests.cpp 中的实现与测试进行纵深验证。一、函数原型与参数说明WslcSetContainerSettingsNetworkingMode是 WslcSDK 公开导出的 C 语言 API用于在WslcContainerSettings结构上设置容器网络模式。其原型如下定义见 wslcsdk.hSTDAPI WslcSetContainerSettingsNetworkingMode(_In_ WslcContainerSettings* containerSettings, _In_ WslcContainerNetworkingMode networkingMode);参数类型方向说明containerSettingsWslcContainerSettings*in目标容器设置句柄必须先通过WslcInitContainerSettings初始化networkingModeWslcContainerNetworkingModein要设置的网络模式枚举值取值WSLC_CONTAINER_NETWORKING_MODE_NONE或WSLC_CONTAINER_NETWORKING_MODE_BRIDGED返回值为HRESULT成功时返回S_OK。该函数已在 SDK 导出表中公开可通过动态链接方式调用见 wslcsdk.def同时也在 WinRT 封装层ContainerSettings中被使用见 ContainerSettings.cpp说明它同时服务于 C/C 原生调用方与 WinRT 调用方。WslcContainerSettings的透明结构特性值得注意的一点是WslcContainerSettings在公共头文件中是一个不透明结构见 wslcsdk.h#define WSLC_CONTAINER_OPTIONS_SIZE 104 #define WSLC_CONTAINER_OPTIONS_ALIGNMENT 8 typedef struct WslcContainerSettings { __declspec(align(WSLC_CONTAINER_OPTIONS_ALIGNMENT)) BYTE _opaque[WSLC_CONTAINER_OPTIONS_SIZE]; } WslcContainerSettings;它固定占用 104 字节的对齐缓冲调用方不能直接访问内部字段必须通过WslcInitContainerSettings初始化再通过一系列WslcSetContainerSettings*系列 API如设置名称、主机名、域名、init 进程、端口映射、卷等逐项配置。WslcSetContainerSettingsNetworkingMode正是这个设置器家族中的网络配置入口。二、WslcContainerNetworkingMode枚举取值详解网络模式的取值定义在 wslcsdk.h 中typedef enum WslcContainerNetworkingMode { WSLC_CONTAINER_NETWORKING_MODE_NONE 0, // No networking / isolated WSLC_CONTAINER_NETWORKING_MODE_BRIDGED 1 } WslcContainerNetworkingMode;枚举值数值语义WSLC_CONTAINER_NETWORKING_MODE_NONE0无网络 / 完全隔离No networking / isolatedWSLC_CONTAINER_NETWORKING_MODE_BRIDGED1桥接网络模式完整的枚举说明可见 wslccontainernetworkingmode.md。其中NONE模式表示容器与外部网络隔离适合对网络隔离有严格要求的场景BRIDGED模式则让容器通过桥接网络参与通信是承载需要对外服务的应用配合端口映射的常用选择。三、源码级实现原理从枚举到内部字符串的转换虽然WslcSetContainerSettingsNetworkingMode的对外签名只接受枚举值但其内部实现实际上会先把枚举转换成字符串表示再写入容器设置的内部结构。实现位于 wslcsdk.cppSTDAPI WslcSetContainerSettingsNetworkingMode(_In_ WslcContainerSettings* containerSettings, _In_ WslcContainerNetworkingMode networkingMode) try { auto internalType CheckAndGetInternalType(containerSettings); internalType-networkMode Convert(networkingMode); return S_OK; } CATCH_RETURN();核心步骤可拆解为两点句柄校验与内部类型还原CheckAndGetInternalType将调用方传入的WslcContainerSettings*还原为 SDK 内部的真实类型同时校验句柄有效性。枚举到字符串的映射Convert函数见 wslcsdk.cpp完成映射PCSTR Convert(WslcContainerNetworkingMode mode) { switch (mode) { case WSLC_CONTAINER_NETWORKING_MODE_NONE: return none; case WSLC_CONTAINER_NETWORKING_MODE_BRIDGED: return bridge; default: THROW_HR_MSG(E_INVALIDARG, Invalid WslcContainerNetworkingMode: %i, mode); } }也就是说WSLC_CONTAINER_NETWORKING_MODE_NONE最终被记录为字符串noneWSLC_CONTAINER_NETWORKING_MODE_BRIDGED被记录为字符串bridge。任何超出枚举范围的值例如99都会在转换阶段直接抛出E_INVALIDARG这一行为在测试中被明确验证见下文第五节。默认值NONEWslcInitContainerSettings在初始化容器设置时会将网络模式默认置为NONE见 wslcsdk.cppSTDAPI WslcInitContainerSettings(_In_ PCSTR imageName, _Out_ WslcContainerSettings* containerSettings) try { auto internalType CheckAndGetInternalType(containerSettings); RETURN_HR_IF_NULL(E_POINTER, imageName); *internalType {}; internalType-image imageName; // Default network configuration to WSLC SDK 0, which is NONE. internalType-networkMode none; return S_OK; } CATCH_RETURN();这意味着如果你不显式调用WslcSetContainerSettingsNetworkingMode容器将默认以无网络隔离模式创建。需要在容器内提供网络服务时务必显式设置为WSLC_CONTAINER_NETWORKING_MODE_BRIDGED。四、网络模式在容器创建时的生效路径设置的网络模式不会立即生效而是在调用WslcCreateContainer创建容器时才被传递到容器运行时。在 wslcsdk.cpp 中可以清楚地看到这条调用链// SDK only exposes the network mode (no additional endpoints today). containerOptions.ContainerNetwork.NetworkMode internalContainerSettings-networkMode;随后该containerOptions被传给会话层的CreateContainerif (SUCCEEDED(errorInfoWrapper.CaptureResult(internalSession-session-CreateContainer(containerOptions, nullptr, result-container))))从源码注释可以看出当前 SDK 仅暴露网络模式这一项网络配置尚无额外的网络端点设置SDK only exposes the network mode (no additional endpoints today)。因此若要为容器配置对外访问能力正确姿势是设置BRIDGED网络模式 通过 WslcSetContainerSettingsPortMappings 添加端口映射二者配合使用。五、完整使用示例与代码将原文档的示例扩展为可直接参考的完整调用序列初始化 → 设置网络模式 → 设置端口映射 → 创建容器#include wslcsdk.h HRESULT CreateBridgedContainer(WslcSession session) { WslcContainerSettings containerSettings; HRESULT hr WslcInitContainerSettings(debian:latest, containerSettings); if (FAILED(hr)) { return hr; } // 步骤 1设置为桥接网络模式使容器具备网络通信能力 hr WslcSetContainerSettingsNetworkingMode( containerSettings, WSLC_CONTAINER_NETWORKING_MODE_BRIDGED); if (FAILED(hr)) { return hr; } // 步骤 2配合端口映射把 Windows 侧端口转发到容器内端口 WslcContainerPortMapping mapping{}; mapping.windowsPort 12342; // Windows 宿主监听端口 mapping.containerPort 8000; // 容器内服务端口 mapping.protocol WSLC_PORT_PROTOCOL_TCP; hr WslcSetContainerSettingsPortMappings(containerSettings, mapping, 1); if (FAILED(hr)) { return hr; } // 步骤 3创建容器网络模式与端口映射在此刻真正生效 WslcContainer container nullptr; PWSTR errorMessage nullptr; hr WslcCreateContainer(session, containerSettings, container, errorMessage); if (FAILED(hr)) { // errorMessage 可能包含更详细的失败信息 return hr; } return S_OK; }该示例的结构与 WslcSdkTests.cpp 中的测试用例保持一致先初始化设置再设置网络模式与端口映射最后调用WslcCreateContainer。六、测试用例验证的行为约束仓库测试 WslcSdkTests.cpp 对WslcSetContainerSettingsNetworkingMode的行为给出了明确的验证依据这些约束对实际开发至关重要1. 非法枚举值返回E_INVALIDARGWslcSdkTests.cppVERIFY_ARE_EQUAL(WslcSetContainerSettingsNetworkingMode(containerSettings, static_castWslcContainerNetworkingMode(99)), E_INVALIDARG);传入枚举范围之外的值如99会立即返回E_INVALIDARG对应上文Convert函数中的default分支。2. NONE 模式不允许配置端口映射WslcSdkTests.cpp// Negative: port mappings with NONE networking must fail at container creation. WslcContainerSettings containerSettings1; VERIFY_SUCCEEDED(WslcInitContainerSettings(debian:latest, containerSettings1)); VERIFY_SUCCEEDED(WslcSetContainerSettingsNetworkingMode(containerSettings1, WSLC_CONTAINER_NETWORKING_MODE_NONE)); WslcContainerPortMapping mapping{}; mapping.windowsPort 12342; mapping.containerPort 8000; mapping.protocol WSLC_PORT_PROTOCOL_TCP; VERIFY_SUCCEEDED(WslcSetContainerSettingsPortMappings(containerSettings1, mapping, 1)); WslcContainer rawContainer nullptr; VERIFY_ARE_EQUAL(WslcCreateContainer(m_defaultSession, containerSettings1, rawContainer, nullptr), E_INVALIDARG); VERIFY_IS_NULL(rawContainer);注意在 NONE隔离模式下设置端口映射WslcSetContainerSettingsNetworkingMode和WslcSetContainerSettingsPortMappings本身都会成功但容器创建阶段会以E_INVALIDARG失败。这说明NONE 端口映射属于逻辑冲突应在业务层提前规避。3. BRIDGED 模式 端口映射可正常创建并建立连通性WslcSdkTests.cpp 及后续用例// Functional: create a container with BRIDGED networking and a port mapping; // verify that a TCP connection from the host reaches the container. WslcProcessSettings procSettings; VERIFY_SUCCEEDED(WslcInitProcessSettings(procSettings));测试用例WslcSdkTests.cpp、WslcSdkTests.cpp、WslcSdkTests.cpp、WslcSdkTests.cpp均以WSLC_CONTAINER_NETWORKING_MODE_BRIDGED创建容器并验证宿主到容器的 TCP 连接可达从测试角度确认了该模式的功能语义。七、使用注意事项综合文档、源码与测试使用WslcSetContainerSettingsNetworkingMode时有以下几点需要留意必须先行初始化containerSettings须先经WslcInitContainerSettings初始化直接传入未初始化的结构体将因内部类型校验失败而报错。默认是隔离模式不调用本 API 时默认网络模式为NONE需要网络能力时须显式设置BRIDGED。网络模式是创建时配置本 API 只修改内存中的设置对象真正的网络行为在WslcCreateContainer时通过ContainerNetwork.NetworkMode生效。与端口映射的组合约束BRIDGED模式可配合WslcSetContainerSettingsPortMappings实现宿主到容器的端口转发NONE模式下配置端口映射会在容器创建时以E_INVALIDARG失败。错误处理非法枚举值超出0/1返回E_INVALIDARG其余失败通过HRESULT返回可在调用WslcCreateContainer时通过errorMessage参数获取详细错误文本。八、延伸阅读本 API 文档入口container-apis/index.md枚举类型文档wslccontainernetworkingmode.md头文件声明与不透明结构定义wslcsdk.h函数实现与Convert映射wslcsdk.cppWinRT 封装层的调用方式ContainerSettings.cpp功能测试与行为约束验证WslcSdkTests.cpp【免费下载链接】WSLWindows Subsystem for Linux项目地址: https://gitcode.com/GitHub_Trending/ws/WSL创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表