You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Neovim中通过Lua获取网络连接状态?

在Lua中直接检测网络状态的方案

Lua标准库没有内置的网络状态检测API,但可以通过以下两种方式实现,无需调用Shell命令并解析输出:

1. 套接字尝试连接检测连通性

通过尝试连接一个稳定的公共服务端口(比如Google的DNS服务器8.8.8.8:53),判断网络是否连通。这种方法跨平台,实现简单,适合大多数场景。

示例代码(依赖LuaSocket库,多数Lua环境如Neovim已内置):

local socket = require("socket")

function is_online()
    local tcp = socket.tcp()
    tcp:settimeout(1) -- 设置1秒超时,避免长时间阻塞
    local ok = tcp:connect("8.8.8.8", 53) ~= nil
    tcp:close()
    return ok
end

-- 用于切换LSP配置的示例
if is_online() then
    -- 加载在线模式下的LSP配置(比如启用远程代码补全、文档同步)
else
    -- 加载离线模式下的LSP配置(比如仅使用本地缓存、禁用远程依赖)
end

2. 平台特定的本地状态读取

如果需要检测本地网络接口的状态(而非连通外网),可以直接读取系统文件或调用平台API:

Linux

读取网卡的运行状态文件:

function is_interface_active(iface_name)
    local state_file = io.open("/sys/class/net/" .. iface_name .. "/operstate", "r")
    if not state_file then return false end
    local state = state_file:read("*l")
    state_file:close()
    return state == "up"
end

-- 示例:检测eth0网卡是否激活
if is_interface_active("eth0") then
    -- 执行对应配置
end

Windows

通过LuaCOM调用WMI接口获取网络适配器状态:

local luacom = require("luacom")

function is_windows_online()
    local wmi = luacom:GetObject("winmgmts:")
    local adapters = wmi:InstancesOf("Win32_NetworkAdapter")
    for adapter in adapters:Iterate() do
        if adapter.NetEnabled then return true end
    end
    return false
end

总结:优先使用套接字连接的方法,通用性更强;如果只需检测本地网络是否连接,再根据平台选择对应方案。

内容的提问来源于stack exchange,提问作者Andrew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 20:24:57