假设一个旧的Linux应用程序正在侦听UNIX域套接字/tmp/foo
。
除了通过UNIX域套接字机制与这个遗留应用程序通信之外,我希望能够通过端口1234上的TCP连接来连接它。
绑定到TCP端口1234然后将所有传入连接重定向到UNIX域套接字/tmp/foo
的最简单方法是什么?
答案 0 :(得分:56)
结果socat可用于实现此目的:
socat TCP-LISTEN:1234,reuseaddr,fork UNIX-CLIENT:/tmp/foo
并增加了一点安全性:
socat TCP-LISTEN:1234,bind=127.0.0.1,reuseaddr,fork,su=nobody,range=127.0.0.0/8 UNIX-CLIENT:/tmp/foo
这些示例已经过测试并按预期工作。
答案 1 :(得分:19)
最简单的?可能是Netcat(又名nc
):
nc -l 1234 | nc -U /tmp/foo
第一个命令在端口1234上侦听传入连接,并将结果数据传递给第二个命令。第二个连接到Unix域套接字/tmp/foo
,并将其输入写入该套接字。请注意,这只接受单个连接,并在删除该连接后立即退出。如果您想继续侦听更多连接,请使用-k
选项:
nc -lk 1234 | nc -U /tmp/foo
您可以通过在一个终端中为该套接字设置侦听器来测试这是否有效:
nc -lUk /tmp/foo
在另一个人写信:
nc localhost 1234
socat,recommended by knorv,更有能力,但使用起来更复杂。
答案 2 :(得分:3)
您应该能够绑定到TCP 1234,获取/ tmp / foo的套接字fd并使用select调用'listen'来获取1234和/ tmp / foo上的数据。写入1234的任何数据,你重写为/ tmp / foo,反之亦然。
您现在充当代理并来回传输数据。
这是一个可能有用的网页:http://osr507doc.sco.com/en/netguide/dusockC.io_multiplexing.html
答案 3 :(得分:0)
没试过:但看起来'lighttpd'可以为你做到这一点:
答案 4 :(得分:0)
另外@ knorv的answer:xinetd
它可以像守护进程一样工作
# cat /etc/xined.d/mysrv
service mysrv
{
disable = no
type = UNLISTED
socket_type = stream
protocol = tcp
wait = no
server = /usr/bin/socat
server_args = STDIN UNIX-CLIENT:/tmp/mysocket.sock
bind = 127.0.0.1
port = 1234
}