监听-如何处理套接字已经打开的可能性



我需要在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实际上应该如何工作。

最新更新