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

Electron Windows端Node Addon的ixWebSocket连接失败求助

Electron Node Addon 集成 ixWebSocket 仅 Windows 失效问题

问题概述

开发包含 Node Addon 的 Electron 项目,原生模块通过 ixWebSocket 与第三方 API 通信。初始化 WebSocket 属性后调用 start() 启动后台线程,代码在 Intel/M1 Mac 均可正常运行,但仅 Windows 系统下失效。

异常中的正常现象

Windows 环境下,通过 CMD 逐行输入 Node REPL 命令可正常执行:

node
> const addon = require("bindings")("addon")
> addon.startSocket()

Electron 主进程代码(main.js)

const { app, BrowserWindow } = require('electron')
const path = require('path')
let addon = require("bindings")("addon");

const createWindow = () => {
    const win = new BrowserWindow({
        width: 400,
        height: 100,
        webPreferences: {
            preload: path.join(__dirname, 'preload.js')
        }
    })
    try 
    {
        addon.startSocket();
    }
    catch(e){
        console.log(e);
    }
    win.loadFile('index.html')
}

app.whenReady().then(() => {
    createWindow()
    app.on('activate', () => {
        if (BrowserWindow.getAllWindows().length === 0) createWindow()
    })
})

app.on('window-all-closed', () => {
    if (process.platform !== 'darwin') app.quit()
})

C++ Addon 代码

#include <ixwebsocket/IXNetSystem.h>
#include <ixwebsocket/IXWebSocket.h>
#include <ixwebsocket/IXUserAgent.h>
#include <iostream>

Napi::Value startSocket(const Napi::CallbackInfo &info)
{
    // Required on Windows
    ix::initNetSystem();

    // Our websocket object
    ix::WebSocket webSocket;

    // Connect to a server with encryption
    std::string url("wss://echo.websocket.org");
    webSocket.setUrl(url);

    std::cout << "Connecting to " << url << "..." << std::endl;

    // Setup callback for messages/events
    webSocket.setOnMessageCallback([](const ix::WebSocketMessagePtr& msg)
        {
            if (msg->type == ix::WebSocketMessageType::Message)
            {
                std::cout << "received message: " << msg->str << std::endl;
                std::cout << "> " << std::flush;
            }
            else if (msg->type == ix::WebSocketMessageType::Open)
            {
                std::cout << "Connection established" << std::endl;
                std::cout << "> " << std::flush;
            }
            else if (msg->type == ix::WebSocketMessageType::Error)
            {
                std::cout << "Connection error: " << msg->errorInfo.reason << std::endl;
                std::cout << "> " << std::flush;
            }
        }
    );

    // Start background thread
    webSocket.start();

    // Send test message
    webSocket.send("hello world");

    std::cout << "> " << std::flush;

    std::string text;
    // Read console input to send messages
    while (std::getline(std::cin, text))
    {
        webSocket.send(text);
        std::cout << "> " << std::flush;
    }

    return Napi::String::New(info.Env(), "Success");
}

Napi::Object Init(Napi::Env env, Napi::Object exports)
{
    exports.Set(
        Napi::String::New(env, "startSocket"),
        Napi::Function::New(env, startSocket));

    return exports;
}

NODE_API_MODULE(addon, Init)

错误信息

Electron 主进程退出时触发以下错误:

[2680:0406/164343.960:ERROR:crashpad_client_win.cc(844)] not connected
error Command failed with exit code 4294930435.

环境信息

  • Node: 16.5.0(已尝试 18.15.0)
  • Electron: ^15.3.1(已尝试 24.0.0)
  • OS: Windows 10 Pro

问题根因与修复方案

  1. 主线程阻塞:C++ 代码中的 while (std::getline(std::cin, text)) 会阻塞 Electron 主线程。Node REPL 是交互式环境,stdin 处于活跃状态,但 Electron 主进程默认未关联控制台 stdin,导致循环卡死引发进程崩溃。
  2. 对象生命周期问题:ix::WebSocket webSocket 是局部变量,startSocket() 执行完毕后会被销毁,但后台线程仍在引用该对象,触发未定义行为。Windows 内存管理机制更严格,因此问题仅在 Windows 暴露。
  3. 重复初始化网络系统:ix::initNetSystem() 应在进程启动时仅调用一次,而非每次调用 startSocket() 都执行。

修复步骤:

  • 移除控制台阻塞循环:删除 while (std::getline...) 代码块,改用 Node 层传递消息到 Addon 的方式处理输入。
  • 延长 WebSocket 对象生命周期:将 ix::WebSocket webSocket 改为静态/全局变量,或用智能指针管理,确保后台线程运行期间对象不会被销毁。
  • 统一初始化网络系统:在 Addon 的 Init 函数中调用一次 ix::initNetSystem(),避免重复初始化。
  • 关联 Electron 控制台:若需保留控制台输入,启动 Electron 时添加 --console 参数,或通过 electron-builder 配置显示控制台窗口,确保 stdin 可用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 12:55:14