lua-socket:unix 域套接字?
lua-socket: unix domain sockets?
我正在使用 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()
时,我得到 "no such file or directory" - 我首先如何创建该套接字? mkfifo /tmp/foo
有人向我推荐了一个 "connection refused" 错误(我不认为 fifo 与域套接字是一回事?)。
有没有在 unix 域套接字上使用 lua套接字的最小工作示例?
编辑:来自 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
据我了解,您不能使用 mkfifo(或任何命令)创建该套接字,因为它将由(侦听)服务器创建。您引用的同一页面上列出了一个示例,但可能很难找到:
sock, err = s:listen([backlog|_32_])
sock, err = s:bind(path)
client_conection, err = s:accept()
基本上,您创建服务器的方式与为 TCP 创建服务器的方式相同,只是您绑定到一个路径,然后开始接受新连接,而不是绑定到 address/port。
虽然luasocket提供了socket.unix
,但我不推荐使用它,除非你已经在使用luasocket并且想避免另一个依赖:
- 在 documentation 的任何地方都没有提到它。
- 代码说“这个模块只是一个如何用新域扩展 LuaSocket 的例子”(unix.h)。
相反,我推荐 luaposix, which has a well-documented 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 套接字的其他替代方案:
我正在使用 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()
时,我得到 "no such file or directory" - 我首先如何创建该套接字? mkfifo /tmp/foo
有人向我推荐了一个 "connection refused" 错误(我不认为 fifo 与域套接字是一回事?)。
有没有在 unix 域套接字上使用 lua套接字的最小工作示例?
编辑:来自 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
据我了解,您不能使用 mkfifo(或任何命令)创建该套接字,因为它将由(侦听)服务器创建。您引用的同一页面上列出了一个示例,但可能很难找到:
sock, err = s:listen([backlog|_32_])
sock, err = s:bind(path)
client_conection, err = s:accept()
基本上,您创建服务器的方式与为 TCP 创建服务器的方式相同,只是您绑定到一个路径,然后开始接受新连接,而不是绑定到 address/port。
虽然luasocket提供了socket.unix
,但我不推荐使用它,除非你已经在使用luasocket并且想避免另一个依赖:
- 在 documentation 的任何地方都没有提到它。
- 代码说“这个模块只是一个如何用新域扩展 LuaSocket 的例子”(unix.h)。
相反,我推荐 luaposix, which has a well-documented 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 套接字的其他替代方案: