【发布时间】:2023-03-18 21:52:01
【问题描述】:
我需要监听一个 UDPsocket,但我不知道监听器是否已经在运行。
我尝试了这种方法来关闭任何现有的 UDPsocket:
s=net.createUDPSocket()
s:on("receive",function(s,c)
.... snip - define the handler ......
if (s~=nil) then
s:close()
print("closing previous instance of UDP Server")
end
s:listen(7333)
print("UDP Server started")
如果套接字打开,则失败并显示:
PANIC: unprotected error in call to Lua API (udpserver.lua:104: not connected)
然后我尝试了这种方法,只在套接字不存在时才调用listen:
if (s==nil) then
s:listen(7333)
print("starting UDP Server")
else
print("Previous instance of UDP Server")
end
这不起作用 - s 永远不会为零,我在重新启动后得到“UDP 服务器的上一个实例”,但套接字实际上并没有在监听。
只需调用 s:listen(7333) 而不检查任何结果
PANIC: unprotected error in call to Lua API (udpserver.lua:105: address in use)
当代码运行且 s:listen 之前已运行时。
我假设 s=net.createUDPSocket() 导致 s 不为零,无论是否曾调用 s:listen。如何检测是否已调用或需要调用 listen?
编辑 - 我是 Lua 的新手,并且正在考虑错误“未受保护的调用”......所以也许有一种方法可以保护调用?一些搜索,我了解到pcall。所以我尝试了这种方法:
lstatus, lret = pcall(s:listen,7333) -- protected call to listen
if lstatus then
print("starting UDP Server")
else
print("UDP Server - listen returned:",lret)
end
令人惊讶的是,我得到了这个结果:
PANIC: unprotected error in call to Lua API (udpserver.lua:104: function arguments expected near ',')
所以受保护的调用本身是不受保护的。
【问题讨论】:
-
试试
pcall(s.listen,s,7333)。我认为您不能按照您的意图使用冒号表示法。