Skip to content

网络工具例程 3:手写 TCP 客户端(raw socket,需谨慎) ​

这一页只讲这一个例程。同组其余例程、以及这个库的函数说明都在 05-05-net。

适用:需要 tcp_client 覆盖不到的底层行为时 | 依赖模块:net plc | 难度:★★★

场景:极少数情况要直接操作 socket(如自定义二进制帧)。下面演示建连、发、收的最小流程。

完整代码(可直接下载运行):

lua
local sock, e = net.socket("TCP")
if not sock then
    print("建不出来:", net.errstr(e))
    return
end

if sock:connect("192.168.1.100", 502, 3000) == 0 then  -- 第 3 参:最多等 3 秒
    sock:setoption("rcvtimeo", 1000)
    sock:send("\x00\x01\x00\x00\x00\x06\x01\x03\x00\x00\x00\x01")
end

-- 读响应:放在定时器里,避免同步 recv 阻塞主循环
timer.start(1000, function()
    local data, err = sock:recv(64)
    if err == 0 and #data > 0 then
        print("收到", #data, "字节")
    end
end)

要点:

  • net.socket("TCP") 返回句柄(失败是 nil);connect / send / recv 都返回错误码,0 为成功。
  • connect 的超时参数必须给,对端不通时才不会卡住主循环。

验证方法:

  1. 目标 502 有 Modbus 服务时,能收到响应字节。
  2. err == 0 表示本次收发正常。

注意事项:

  • recv 是同步阻塞(等到超时),超时要先用 sock:setoption("rcvtimeo", ms) 设好,否则一直等到对端关连接。
  • 选项只有 setoption 一个入口,不再有 net.rcvtimeo 这种单独函数。

LPPLC 工业物联网云平台 · 软硬件与云平台全栈自研