我需要在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)
然后我尝试了这种方法,只在套接字不存在的情况下调用侦听:
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。如何检测侦听是否已被调用或需要被调用?
编辑-我是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如何工作(或不工作(的评论或解释,我提出了这种方法。
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实际上应该如何工作。