Lua NodeMCU net.udpsocket:listen-如何处理套接字已经打开的可能性?

时间:2018-07-28 22:12:45

标签: lua nodemcu

我需要在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 ',')

因此,受保护的呼叫本身不受保护。

1 个答案:

答案 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实际上应该如何工作。