lua-socket:unix域套接字?

时间:2015-05-14 15:09:40

标签: sockets unix lua

我正在使用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是否有任何最小的工作示例?

编辑:从保罗的解决方案来看,如果有人有兴趣,这是一个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 个答案:

答案 0 :(得分:1)

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

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

基本上,您创建服务器的方式与为TCP执行服务器的方式相同,只是绑定到路径,然后开始接受新连接。

答案 1 :(得分:0)

尽管 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 套接字的替代方案: