2 changed files with 75 additions and 1 deletions
@ -0,0 +1,67 @@
@@ -0,0 +1,67 @@
|
||||
/* |
||||
* @Author: 李皓 hao_li_work@163.com |
||||
* @Date: 2026-07-28 16:31:45 |
||||
* @LastEditors: 李皓 hao_li_work@163.com |
||||
* @LastEditTime: 2026-07-28 16:44:07 |
||||
* @FilePath: \pc\preload.js |
||||
* @Description: |
||||
* @Version: 1.0.0 |
||||
*/ |
||||
const { contextBridge } = require('electron') |
||||
const nodeNet = require('net') |
||||
const dns = require('dns') |
||||
|
||||
/** |
||||
* 尝试通过 TCP 连接指定端口检测主机是否可达 |
||||
*/ |
||||
function tryConnect(host, port, timeout) { |
||||
return new Promise((resolve) => { |
||||
const socket = new nodeNet.Socket() |
||||
socket.setTimeout(timeout) |
||||
socket.on('connect', () => { socket.destroy(); resolve(true) }) |
||||
socket.on('error', () => { socket.destroy(); resolve(false) }) |
||||
socket.on('timeout', () => { socket.destroy(); resolve(false) }) |
||||
socket.connect(port, host) |
||||
}) |
||||
} |
||||
|
||||
/** |
||||
* 网络检测对象 |
||||
*/ |
||||
const networkUtil = { |
||||
/** |
||||
* 检测目标主机网络连通性 |
||||
* @param {string} host - 目标主机地址 |
||||
* @param {number} timeout - 超时时间(毫秒) |
||||
* @returns {Promise<boolean>} - 是否可达 |
||||
*/ |
||||
async ping(host, timeout) { |
||||
// 1. 先检查 DNS 能否解析
|
||||
try { |
||||
await dns.promises.resolve(host) |
||||
} catch { |
||||
return false |
||||
} |
||||
|
||||
// 2. 依次尝试常见端口(443 优先,80 兜底)
|
||||
const ports = [443, 80] |
||||
for (const port of ports) { |
||||
const ok = await tryConnect(host, port, timeout) |
||||
if (ok) return true |
||||
} |
||||
|
||||
return false |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 应用传感器对象 |
||||
*/ |
||||
const appSensor = { |
||||
version: '1.0.0', |
||||
name: 'appSensor' |
||||
} |
||||
|
||||
// 安全暴露 API 给渲染进程(挂载到 window.net,页面中可用 net.ping() 调用)
|
||||
contextBridge.exposeInMainWorld('net', networkUtil) |
||||
contextBridge.exposeInMainWorld('appSensor', appSensor) |
||||
Loading…
Reference in new issue