我需要在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 Server的先前实例”,但是套接字实际上并没有监听。
在没有任何检查的情况下仅调用s:listen(7333)
PANIC: unprotected error in call to Lua API (udpserver.lua:105: address in use)
运行代码并且先前已运行s:listen。
我假设s = net.createUDPSocket()导致s不为nil,无论是否曾经调用过s: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 ',')
因此,受保护的呼叫本身不受保护。
答案 0 :(得分:0)
鉴于缺乏关于pcall如何工作(或不工作)的评论或解释,我想出了这种方法。
if not s_listening then
lstatus = s:listen(7333)
print("starting UDP Server - listening")
s_listening = 1
else
print("UDP Server already listening")
end
我仍然想知道如何查询UDPsocket的状态,或者pcall实际上应该如何工作。