如何将本地unix套接字映射到inet套接字?

时间:2009-05-21 16:09:49

标签: mysql perl socat unix-socket inet-socket

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

我花了很多时间进行了搜索,但确实找到了socat,据说这是我正在寻找的东西。我想知道是否有人对如何实现这一点有任何建议。我一直在使用的命令行(部分成功)是:

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

现在我可以建立连接并与服务器通信。不幸的是,任何尝试进行多个连接都会失败,因为我需要使用fork选项,但是这个选项似乎会使连接失效。

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

感谢。

3 个答案:

答案 0 :(得分:6)

将参数的顺序反转为socat,并且有效。

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

这会指示socat

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

  6. 以相反的方式写作

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

    不起作用,因为这会指示socat

    1. 打开与/var/lib/mysql/mysql.sock套接字的UNIX域连接。
    2. 收听TCP端口6666(带SO_REUSEADDR
    3. 等待接受连接
    4. 建立连接时,会产生一个工作子项以在两个地址之间传输数据。
    5. 父母继续接受第二个地址的连接,但不再有第一个地址可用:它被提供给第一个孩子。因此,从现在开始,没有什么有用的。

答案 1 :(得分:0)

是的,您可以在Perl中执行此操作。

查看perlipcIO::SelectIO::SocketBeej's Guide to Network Programming

答案 2 :(得分:0)

您可能需要考虑在POE中执行此操作 - 它是用于处理事件的异步库,因此它看起来非常适合任务。

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

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