【问题标题】:lua-socket: unix domain sockets?lua-socket:unix 域套接字?
【发布时间】:2015-05-14 15:09:40
【问题描述】:

我正在使用 lua-socket 3.0rc1.3(Ubuntu Trusty 附带)和 lua 5.1。我正在尝试监听 unix 域套接字,我能找到的唯一示例代码是 this

-- send stdin through unix socket
socket = require"socket"
socket.unix = require"socket.unix"
c = assert(socket.unix())
assert(c:connect("/tmp/foo"))
while 1 do
    local l = io.read()
    assert(c:send(l .. "\n"))
end

问题是,当我尝试 connect() 时,我得到“没有这样的文件或目录” - 我如何首先创建那个套接字? mkfifo /tmp/foo 有人推荐给我一个“连接被拒绝”的错误(我不认为 fifo 与域套接字是一回事吗?)。

有没有在 unix 域套接字上使用 luasocket 的最小工作示例?

编辑:来自 Paul 的解决方案,如果有人感兴趣,这里是一个 MWE

libsocket = require "socket"
libunix = require "socket.unix"
socket = assert(libunix())
SOCKET="/tmp/socket"
assert(socket:bind(SOCKET))
assert(socket:listen())
conn = assert(socket:accept())
while 1 do
    data=assert(conn:receive())
    print("Got line: " .. data)
    conn:send("echo: " .. data .. "\n")
    if data == "." then conn:close() return end
end

【问题讨论】:

    标签: sockets unix lua


    【解决方案1】:

    据我了解,您无法使用 mkfifo(或任何命令)创建该套接字,因为它将由(侦听)服务器创建。在您引用的同一页面上列出了一个示例,但可能很难找到:

    sock, err = s:listen([backlog|_32_])
    sock, err = s:bind(path)
    client_conection, err = s:accept()
    

    基本上,您创建服务器的方式与创建 TCP 的方式相同,只不过不是绑定到地址/端口,而是绑定到路径,然后开始在其上接受新连接。

    【讨论】:

      【解决方案2】:

      虽然luasocket提供了socket.unix,但我不推荐使用它,除非你已经在使用luasocket并且想避免其他依赖:

      • documentation 中的任何地方都没有提到它。
      • 代码显示“此模块只是如何使用新域扩展 LuaSocket 的示例”(unix.h)。

      我推荐luaposix,它有一个有据可查的API。这是一个简单的例子:

      -- Send stdin through a Unix socket.
      local socket = require("posix.sys.socket")
      local unistd = require("posix.unistd")
      local fd = assert(socket.socket(socket.AF_UNIX, socket.SOCK_STREAM, 0))
      assert(socket.connect(fd, {family = socket.AF_UNIX, path = "/tmp/foo"}))
      while true do
          local line = io.read()
          if not line then
              break
          end
          line = line .. "\n"
          local i = 1
          while i < #line do
              i = assert(socket.send(fd, line:sub(i)))
          end
      end
      unistd.close(fd)
      

      其他一些明确支持 Unix 套接字的替代方案:

      【讨论】:

        猜你喜欢
        • 2013-06-26
        • 2011-09-22
        • 2012-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-18
        • 1970-01-01
        • 2011-08-13
        相关资源
        最近更新 更多