【问题标题】:Lua NodeMCU net.udpsocket:listen - how to handle the possibility of the socket already being open?Lua NodeMCU net.udpsocket:listen - 如何处理套接字已经打开的可能性?
【发布时间】: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)。我认为您不能按照您的意图使用冒号表示法。

标签: lua nodemcu


【解决方案1】:

鉴于缺乏 cmets 或关于 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 应该如何工作。

【讨论】:

    猜你喜欢
    • 2016-04-01
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    相关资源
    最近更新 更多