【问题标题】:Can I find out the status of the port using the Lua "socket" library?我可以使用 Lua“socket”库找出端口的状态吗?
【发布时间】:2018-02-12 12:12:23
【问题描述】:

帮助我跟踪特定端口的状态:“LISTENING”、“CLOSE_WAIT”、“ESTABLISHED”。 我有一个使用 netstat 命令的模拟解决方案:

local command = 'netstat -anp tcp | find ":1926 " '
local h = io.popen(command,"rb")
local result = h:read("*a")
h:close()
print(result)
if result:find("ESTABLISHED") then
   print("Ok")
end

但我需要对Lua socket library 做同样的事情。 有可能吗?

【问题讨论】:

  • 为什么?您肯定已经知道自己的套接字的状态吗?如果你打电话给listen(),那就是在听;如果您致电connect() 或accept(),则它已建立;如果它已收到并结束流,则处于 CLOSE_WAIT 中。
  • @EJP 该问题并未说明套接字由进行查询的同一进程拥有。即使那样,你也不能轻易推断出一些状态——例如TIME_WAIT - 不查询内核。

标签: sockets lua


【解决方案1】:

就像@Peter 所说,netstat 使用 proc 文件系统来收集网络信息,尤其是端口绑定。 LuaSockets 有自己的库来检索连接信息。例如,

聆听 您可以使用master:listen(backlog) 指定套接字愿意接收连接,将对象转换为服务器对象。服务器对象支持accept、getsockname、setoption、settimeout 和close 方法。参数 backlog 指定可以排队等待服务的客户端连接数。如果队列已满并且另一个客户端尝试连接,则连接被拒绝。如果成功,该方法返回 1。如果出错,该方法返回 nil,然后是错误消息。

以下方法将返回一个带有本地 IP 地址的字符串和一个带有 端口 的数字。如果发生错误,该方法返回 nil。

master:getsockname()
client:getsockname()
server:getsockname()

还有这个方法: client:getpeername() 这将返回一个字符串,其中包含对等方的 IP 地址,后跟对等方用于连接的 端口 号。如果发生错误,该方法返回 nil。

对于“CLOSE_WAIT”、“ESTABLISHED”或您要检索的其他连接信息,请阅读Official Documentation。它包含您需要的一切,并附有简明的方法说明。

【讨论】:

    【解决方案2】:

    您不能使用套接字 API 查询另一个进程所拥有的套接字的状态,这正是 LuaSocket 在幕后使用的。

    为了访问有关另一个进程的信息,您需要改为查询操作系统。假设您使用的是 Linux,这通常意味着查看 proc 文件系统。

    我对 Lua 不是很熟悉,但是快速的 Google 给了我这个项目:https://github.com/Wiladams/lj2procfs。我认为这可能是您需要的,假设他们已经为您需要的相关/proc/net 文件编写了解码器。

    至于哪个文件?如果只是状态,我想你想要http://www.onlamp.com/pub/a/linux/2000/11/16/LinuxAdmin.html中涵盖的tcp文件

    【讨论】:

      猜你喜欢
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-11
      • 2014-11-15
      • 2013-12-15
      • 2019-02-14
      • 2012-01-30
      相关资源
      最近更新 更多