工程提交
This commit is contained in:
101
4G/tools/resource/soc_script/v2025.12.31.22/lib/udpsrv.lua
Normal file
101
4G/tools/resource/soc_script/v2025.12.31.22/lib/udpsrv.lua
Normal file
@@ -0,0 +1,101 @@
|
||||
--[[
|
||||
@module udpsrv
|
||||
@summary UDP服务器
|
||||
@version 1.0
|
||||
@date 2023.7.28
|
||||
@author wendal
|
||||
@demo socket
|
||||
@tag LUAT_USE_NETWORK
|
||||
@usage
|
||||
-- 具体用法请查
|
||||
阅demo
|
||||
]]
|
||||
|
||||
local sys = require "sys"
|
||||
|
||||
local udpsrv = {}
|
||||
local srvs = {}
|
||||
|
||||
--[[
|
||||
创建UDP服务器
|
||||
@api udpsrv.create(port, topic, adapter)
|
||||
@int 端口号, 必填, 必须大于0小于65525
|
||||
@string 收取UDP数据的topic,必填
|
||||
@int 网络适配编号, 默认为nil,可选
|
||||
@return table UDP服务的实体, 若创建失败会返回nil
|
||||
]]
|
||||
function udpsrv.create(port, topic, adapter)
|
||||
local srv = {}
|
||||
-- udpsrv.port = port
|
||||
-- srv.topic = topic
|
||||
srv.rxbuff = zbuff.create(1500)
|
||||
local sc = socket.create(adapter, function(sc, event)
|
||||
-- log.info("udpsrv", sc, event, "EVENT", socket.EVENT, "CLOSED", socket.CLOSED)
|
||||
if event == socket.EVENT then
|
||||
local rxbuff = srv.rxbuff
|
||||
while 1 do
|
||||
local succ, data_len, remote_ip, remote_port = socket.rx(sc, rxbuff)
|
||||
-- log.info("udpsrv", "???", succ, data_len, remote_ip, remote_port)
|
||||
if succ and data_len and data_len > 0 then
|
||||
local resp = rxbuff:toStr(0, rxbuff:used())
|
||||
rxbuff:del()
|
||||
if remote_ip and #remote_ip == 5 then
|
||||
local ip1,ip2,ip3,ip4 = remote_ip:byte(2),remote_ip:byte(3),remote_ip:byte(4),remote_ip:byte(5)
|
||||
remote_ip = string.format("%d.%d.%d.%d", ip1, ip2, ip3, ip4)
|
||||
else
|
||||
remote_ip = nil
|
||||
end
|
||||
sys.publish(topic, resp, remote_ip, remote_port)
|
||||
else
|
||||
if not succ then
|
||||
socket.close(sc)
|
||||
socket.connect(sc, "255.255.255.255", 0)
|
||||
end
|
||||
break
|
||||
end
|
||||
end
|
||||
elseif event == socket.CLOSED then
|
||||
log.info("dhcpsrv", "网络中断,执行关闭流程")
|
||||
socket.close(self.sc)
|
||||
end
|
||||
end)
|
||||
if sc == nil then
|
||||
return
|
||||
end
|
||||
srv.sc = sc
|
||||
-- socket.debug(sc, true)
|
||||
socket.config(sc, port, true)
|
||||
if socket.connect(sc, "255.255.255.255", 0) then
|
||||
srv.send = function(self, data, ip, port)
|
||||
if self.sc and data then
|
||||
-- log.info("why?", self.sc, data, ip, port)
|
||||
return socket.tx(self.sc, data, ip, port)
|
||||
end
|
||||
end
|
||||
srv.close = function(self)
|
||||
socket.close(self.sc)
|
||||
-- sys.wait(200)
|
||||
socket.release(self.sc)
|
||||
srvs[self.sc] = nil
|
||||
self.sc = nil
|
||||
end
|
||||
srvs[srv.sc] = true
|
||||
-- log.info("udpsrv", "监听开始")
|
||||
return srv
|
||||
end
|
||||
socket.close(sc)
|
||||
-- sys.wait(200)
|
||||
socket.release(sc)
|
||||
-- log.info("udpsrv", "监听失败")
|
||||
end
|
||||
|
||||
sys.subscribe("IP_READY", function()
|
||||
for sc, value in pairs(srvs) do
|
||||
log.info("udpsrv", "自动重连udpsrv", sc)
|
||||
if sc then
|
||||
socket.connect(sc, "255.255.255.255", 0)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
return udpsrv
|
||||
Reference in New Issue
Block a user