2009-05-21 92 views
2

我很好奇,如果有可能将UNIX套接字映射到INET套接字上。情况很简单,我想连接到MySQL服务器。不幸的是,它禁用了INET套接字,因此我只能连接到UNIX套接字。我正在使用/写入的工具必须在INET套接字上连接,所以我试图查看是否可以将一个映射到另一个套接字上。如何将本地unix套接字映射到inet套接字?

它花了大量的搜索,但我确实发现socat,据称我正在寻找。我想知道如果有人有任何建议如何做到这一点。我一直在使用(与部分成功)的命令行是:

socat -v UNIX-CONNECT:/var/lib/mysql/mysql.sock TCP-LISTEN:6666,reuseaddr 

现在我可以建立连接,跟我们的服务器。不幸的是,任何尝试进行多个连接失败,因为我需要使用fork选项,但此选项似乎使连接无法正常工作。

我知道我可以用Perl(我的首选语言)解决这个问题,但我宁愿避免自己编写整个实现。我熟悉IO :: Socket库,我只是希望任何人都有经验做这种事情。接受建议/想法。

谢谢。

回答

6

将您的参数的顺序颠倒为socat,它可以工作。

socat -v tcp-l:6666,reuseaddr,fork unix:/var/lib/mysql/mysql.sock 

这指示socat

  1. 听TCP端口6666(与SO_REUSEADDR
  2. 等待接受连接
  3. 当建立连接时,叉。在孩子身上,继续下面的步骤。在父级中,转至2.
  4. 打开与/var/lib/mysql/mysql.sock套接字的UNIX域连接。
  5. 在两个端点之间传输数据,然后退出。

写它周围的其他方法

socat -v unix:/var/lib/mysql/mysql.sock tcp-l:6666,reuseaddr,fork 

是不行的,因为这指示socat

  1. 打开一个UNIX域连接到/var/lib/mysql/mysql.sock插座。
  2. 监听TCP端口6666(与SO_REUSEADDR
  3. 等待接受连接
  4. 当连接时,产生一个工人的孩子两个地址之间传输数据。
  5. 父节点继续接受第二个地址上的连接,但不再具有可用的第一个地址:它被提供给第一个孩子。所以从这一点上可以做任何有用的事情。
+0

谢谢你,那正是我所期待的。令人惊讶的是,这是多么愚蠢的错误。 – Danny 2009-05-22 02:16:18

0

您可能想考虑在POE中执行它 - 它是用于处理事件的异步库,因此它对于任务来说看起来很棒。

这不是100%相关,但我使用POE在无状态协议(HTTP)和有状态协议(telnet会话,更具体地说是MUD会话)之间编写代理,而且它非常简单 - 您可以检查代码在这里:http://www.depesz.com/index.php/2009/04/08/learning-poe-http-2-mud-proxy/

在评论中有人还建议Coro/AnyEvent - 我还没有玩过它,但你可能想检查它。