Skip to content

Repository files navigation

TCP_UDP Cheat Engine 网络插件

为 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.liblua53-64.lib(x64)或 lua53-32.lib(x86)。
    • 导出定义:TCP_UDP.def(显式导出 CE 插件入口:CEPlugin_GetVersionCEPlugin_InitializePluginCEPlugin_DisablePlugin)。
  • 步骤:
    1. 打开解决方案,选择 Debug|x64(或与 CE 一致)。
    2. 生成 TCP_UDP.dll
    3. 将 DLL 复制到 CE 的 plugins 目录,或使用 CE 的“插件管理器”加载。

Lua API

TCP 同步 API

  • pluginTCPConnect(host: string, port: int) -> boolean
  • pluginTCPSend(data: string) -> int(返回发送字节数)
  • pluginTCPRecv(maxlen?: int=4096, timeoutMs?: int=1000) -> string(收到的数据,可能为空)
  • pluginTCPClose() -> nil

TCP 异步与非阻塞 API

  • pluginTCPStartRecv() -> boolean(启动后台接收线程)
  • pluginTCPStopRecv() -> boolean(停止后台接收线程)
  • pluginTCPRecvNonblocking(maxlen?: int=4096) -> string(从队列弹出一条数据,不阻塞)
  • pluginTCPSetNoDelay(enable: boolean) -> boolean(启/禁 TCP_NODELAY,减少小包延迟)

UDP 同步 API

  • pluginUDPBind(host?: string="", port: int) -> boolean
    • host 为空或 "" 时,默认绑定 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: int
  • pluginUDPClose() -> nil

UDP 异步与非阻塞 API

  • pluginUDPStartRecv() -> boolean(启动后台接收线程)
  • pluginUDPStopRecv() -> boolean(停止后台接收线程)
  • pluginUDPRecvNonblocking(maxlen?: int=4096) -> data: string, ip?: string|nil, port: int

线程安全说明:后台接收线程只操作 Winsock 与内部队列,不直接调用 Lua;Lua 侧通过非阻塞 API 从队列弹出数据,避免跨线程 Lua 访问导致的风险。

简单调用示例

TCP:HTTP GET 测试(有回包)

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

UDP:DNS 查询(有回包)

-- 查询 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)

异步接收 + 20ms 轮询(避免 UI 卡顿)

-- 启动接收线程(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 支持或特定协议解析(如自定义二进制帧) 请提出需求,我可进一步扩展与实现。

About

Cheat Engine的tcp、udp的发包插件,在lua环境没有FFI库的解决方案

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages