主题
网络工具例程 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的超时参数必须给,对端不通时才不会卡住主循环。
验证方法:
- 目标 502 有 Modbus 服务时,能收到响应字节。
err == 0表示本次收发正常。
注意事项:
recv是同步阻塞(等到超时),超时要先用sock:setoption("rcvtimeo", ms)设好,否则一直等到对端关连接。- 选项只有
setoption一个入口,不再有net.rcvtimeo这种单独函数。