为 Cheat Engine (CE) 提供基于 Winsock 的 TCP/UDP 收发能力,支持同步与异步两种调用模式。在保证稳定与线程安全的前提下,新增后台接收线程与非阻塞队列,以避免 UI 卡顿,结合 20ms 轮询可以实现接收端到端延迟接近 50ms(具体取决于网络与对端响应)。
- 基于 Winsock 的 CE 插件,为 Lua 提供 TCP/UDP 网络能力。
- 支持同步与异步调用:
- 同步:快速测试用,可能在等待期间阻塞 UI。
- 异步:后台线程接收,Lua 端非阻塞弹队列,避免 UI 卡顿,兼容多线程。
- 延迟优化:
- TCP 连接成功后默认禁用 Nagle(TCP_NODELAY),降低小包延迟(也可 Lua 动态切换)。
- UDP 绑定与发送自动匹配地址族(默认 IPv4),避免常见的 sendto(-1)。
- 环境:Windows + Visual Studio(建议 VS2022),与 CE 位数一致(x64 或 x86)。
- 已配置的关键项:
- 链接库:
Ws2_32.lib、lua53-64.lib(x64)或lua53-32.lib(x86)。 - 导出定义:
TCP_UDP.def(显式导出 CE 插件入口:CEPlugin_GetVersion、CEPlugin_InitializePlugin、CEPlugin_DisablePlugin)。
- 链接库:
- 步骤:
- 打开解决方案,选择
Debug|x64(或与 CE 一致)。 - 生成
TCP_UDP.dll。 - 将 DLL 复制到 CE 的
plugins目录,或使用 CE 的“插件管理器”加载。
- 打开解决方案,选择
pluginTCPConnect(host: string, port: int) -> booleanpluginTCPSend(data: string) -> int(返回发送字节数)pluginTCPRecv(maxlen?: int=4096, timeoutMs?: int=1000) -> string(收到的数据,可能为空)pluginTCPClose() -> nil
pluginTCPStartRecv() -> boolean(启动后台接收线程)pluginTCPStopRecv() -> boolean(停止后台接收线程)pluginTCPRecvNonblocking(maxlen?: int=4096) -> string(从队列弹出一条数据,不阻塞)pluginTCPSetNoDelay(enable: boolean) -> boolean(启/禁 TCP_NODELAY,减少小包延迟)
pluginUDPBind(host?: string="", port: int) -> booleanhost为空或""时,默认绑定 IPv4 的0.0.0.0。
pluginUDPSend(host: string, port: int, data: string) -> int(返回发送字节数;若已绑定则复用绑定套接字)pluginUDPRecv(maxlen?: int=4096, timeoutMs?: int=1000) -> data: string, ip: string, port: intpluginUDPClose() -> nil
pluginUDPStartRecv() -> boolean(启动后台接收线程)pluginUDPStopRecv() -> boolean(停止后台接收线程)pluginUDPRecvNonblocking(maxlen?: int=4096) -> data: string, ip?: string|nil, port: int
线程安全说明:后台接收线程只操作 Winsock 与内部队列,不直接调用 Lua;Lua 侧通过非阻塞 API 从队列弹出数据,避免跨线程 Lua 访问导致的风险。
local host = "example.com"
local port = 80
local req = "GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n"
if pluginTCPConnect(host, port) then
pluginTCPSetNoDelay(true) -- 低延迟
local sent = pluginTCPSend(req)
print("sent", sent)
local data = pluginTCPRecv(8192, 5000)
print("recv len", #data)
print(data)
pluginTCPClose()
end-- 查询 example.com 的 A 记录(十六进制报文)
local payloadHex = "12 34 01 00 00 01 00 00 00 00 00 00 07 65 78 61 6D 70 6C 65 03 63 6F 6D 00 00 01 00 01"
local function hex2bin(hex) hex = hex:gsub("%s+",""); return (hex:gsub("..", function(cc) return string.char(tonumber(cc,16) or 0) end)) end
local payload = hex2bin(payloadHex)
pluginUDPBind("0.0.0.0", 0) -- 使用系统分配端口
local sent = pluginUDPSend("1.1.1.1", 53, payload)
print("sent", sent)
local data, ip, port = pluginUDPRecv(8192, 5000)
print("recv", #data, "from", ip, port)-- 启动接收线程(TCP/UDP)
pluginTCPStartRecv()
pluginUDPStartRecv()
pluginTCPSetNoDelay(true)
-- 20ms 定时器轮询队列(目标 <50ms 响应)
local t = createTimer(nil, false)
t.Interval = 20
t.OnTimer = function()
local tcpData = pluginTCPRecvNonblocking(8192)
if #tcpData > 0 then print("TCP nb recv", #tcpData) end
local udpData, ip, port = pluginUDPRecvNonblocking(8192)
if #udpData > 0 then print("UDP nb recv", #udpData, "from", ip or "", port or 0) end
end
t.Enabled = true
-- 停止时清理:
-- t.destroy(); pluginTCPStopRecv(); pluginUDPStopRecv();-- 公网目标:112.125.89.8:33331(是否有服务与回显未知)
-- TCP 简测:
pluginTCPConnect("112.125.89.8", 33331)
pluginTCPSetNoDelay(true)
pluginTCPSend("Hello TCP from CE " .. os.date("%H:%M:%S"))
local data = pluginTCPRecv(4096, 3000)
print("TCP recv", #data)
pluginTCPClose()
-- UDP 简测:
pluginUDPBind("0.0.0.0", 33331)
pluginUDPSend("112.125.89.8", 33331, "Hello UDP from CE " .. os.date("%H:%M:%S"))
local udata, ip, port = pluginUDPRecv(4096, 3000)
print("UDP recv", #udata, ip, port)说明:公网目标是否回包取决于对端服务与防火墙/NAT;为验证链路,请优先使用上面的 HTTP/UDP DNS 示例或本机回显服务。
- 启用
pluginTCPSetNoDelay(true),与异步接收搭配,降低小包延迟。 - 使用 20ms 定时器轮询非阻塞队列,避免在 UI 线程进行阻塞等待。
- 减少高频
print/log输出,防止 UI 性能抖动。 - UDP 绑定建议明确 IPv4:
pluginUDPBind("0.0.0.0", port)。 - 如果对端协议固定,可缓存
getaddrinfo结果以减少解析开销(如需可提供增强版本)。
- 无回包:公网地址可能无服务或不回显;请使用 HTTP/DNS 示例或本机 echo 服务验证。
- 超时:提高
timeoutMs(如 5000–10000ms),但避免在 UI 线程调用同步Recv;统一使用异步与定时器轮询。 - 绑定冲突:端口被占用时绑定失败;UDP 可用
0由系统分配临时端口。 - 防火墙/NAT:可能拦截回包,建议本机或局域网先验证功能。
TCP_UDP/
├── README.md
├── TCP_UDP.def
├── TCP_UDP.vcxproj*
├── cepluginsdk.h
├── tcp_udp_plugin.cpp
├── test_ce_plugin.lua
└── x64/Debug|Release (编译产物)
- 新增异步接收线程与非阻塞 Lua API(TCP/UDP),避免 UI 卡顿并提升响应。
- TCP 连接后默认禁用 Nagle(
TCP_NODELAY),也可通过 Lua 动态切换。 - 修复 UDP 地址族匹配(默认 IPv4),发送解析匹配绑定族,避免
sendto(-1)。
如需:
- 返回最近一次套接字错误码与字符串(
pluginGetLastSocketError) - 更高性能的 IOCP 模式、多连接管理
- TLS/SSL 支持或特定协议解析(如自定义二进制帧) 请提出需求,我可进一步扩展与实现。