Lua-socket:Unix域套接字?

6
我正在使用Ubuntu Trusty自带的lua-socket 3.0rc1.3和lua 5.1。我想要监听一个Unix域套接字,但我能找到的唯一示例代码是这个
-- 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的最小工作示例?
编辑:从保罗的解决方案中,如果有人感兴趣,这里有一个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
2个回答

3
尽管 luasocket 提供了 socket.unix,但我不建议使用它,除非您已经在使用 luasocket 并想避免另一个依赖:
  • 它在 文档 中没有提到。
  • 代码中说“此模块只是扩展 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 sockets 的其他替代方案:

2
据我所知,您无法使用mkfifo(或任何命令)创建该套接字,因为它将由(监听)服务器创建。在您引用的同一页中有一个示例,但可能很难找到:
sock, err = s:listen([backlog|_32_])
sock, err = s:bind(path)
client_conection, err = s:accept()

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接