我如何可以本地unix socket到inet插座?
-
23-08-2019 - |
题
我很好奇如果这是可能的映射UNIX socket到INET座。这种情况是简单的,我想到连接MySQL server.不幸的是,它具有INET座残疾人和因此我只能连接与UNIX socket.工具,我用写有连接在一INET插座,所以我想看看如果我可以的地图的一个月。
它花了相当数量的搜索,但是我没找到 socat, ,据称没什么我要找的。我想知道,如果任何人有任何建议,就如何实现这一目标。该命令行我已经用(部分取得成功)是:
socat -v UNIX-CONNECT:/var/lib/mysql/mysql.sock TCP-LISTEN:6666,reuseaddr
现在我可以使连接和谈的服务器。不幸的是,任何试图使多个连接失败,因为我需要用叉选项,但这一选择似乎呈现连接,无法正常工作。
我知道我可以解决这一问题与Perl(我的首选的语言),但是我宁愿避免编写整个执行自己。我熟悉的IO::座图书馆,我只是希望任何人经验做这样的事情。开放的建议/想法。
谢谢。
解决方案
将你的参数顺序颠倒过来 socat
, ,并且它有效。
socat -v tcp-l:6666,reuseaddr,fork unix:/var/lib/mysql/mysql.sock
这指示 socat
到
- 侦听 TCP 端口 6666(使用
SO_REUSEADDR
) - 等待接受连接
- 建立连接后,分叉。在孩子中,继续执行以下步骤。在父级中,转到2。
- 打开到 UNIX 域的连接
/var/lib/mysql/mysql.sock
插座。 - 在两个端点之间传输数据,然后退出。
反过来写
socat -v unix:/var/lib/mysql/mysql.sock tcp-l:6666,reuseaddr,fork
不起作用,因为这指示 socat
到
- 打开到 UNIX 域的连接
/var/lib/mysql/mysql.sock
插座。 - 侦听 TCP 端口 6666(使用
SO_REUSEADDR
) - 等待接受连接
- 建立连接后,生成一个工作子进程以在两个地址之间传输数据。
- 父级继续接受第二个地址上的连接,但第一个地址不再可用:它被交给了第一个孩子。所以从现在开始就不能做任何有用的事情了。
其他提示
是的,你可以这样做在Perl。
看看 perlipc, IO::选择, IO::插座 和 Beej的指导网络,编程.
您可能要考虑在POE做它 - 它是异步的库来处理事件,所以它看起来像伟大的任务
有不是100%相关,但我用POE写无状态协议之间代理(HTTP)和有状态的协议(Telnet会话,并且更具体 - MUD会话),并且这是相当简单的 - 可以在检查代码在这里: HTTP:/ /www.depesz.com/index.php/2009/04/08/learning-poe-http-2-mud-proxy/ 。
在评论有人还建议科罗/ AnyEvent - 我还没有发挥它,但你可能要检查它
。