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
问题根因与修复方案
- 主线程阻塞:C++ 代码中的
while (std::getline(std::cin, text))会阻塞 Electron 主线程。Node REPL 是交互式环境,stdin 处于活跃状态,但 Electron 主进程默认未关联控制台 stdin,导致循环卡死引发进程崩溃。 - 对象生命周期问题:
ix::WebSocket webSocket是局部变量,startSocket()执行完毕后会被销毁,但后台线程仍在引用该对象,触发未定义行为。Windows 内存管理机制更严格,因此问题仅在 Windows 暴露。 - 重复初始化网络系统:
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
相关产品推荐
相关产品推荐

