代码之家  ›  专栏  ›  技术社区  ›  Danny

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

  •  2
  • Danny  · 技术社区  · 15 年前

    我很好奇能否将一个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 回复  |  直到 15 年前
        1
  •  6
  •   ephemient    15 年前

    将参数的顺序颠倒为 socat 这是有效的。

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

    这个指令 SOCAT

    1. 监听TCP端口6666(使用 SO_REUSEADDR )
    2. 等待接受连接
    3. 连接完成后,拨叉。在儿童中,继续以下步骤。在父级中,转到2。
    4. 打开到的Unix域连接 /var/lib/mysql/mysql.sock 插座。
    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(使用 苏尔苏 )
    3. 等待接受连接
    4. 当建立连接时,产生一个工作者子级以在两个地址之间传输数据。
    5. 父级继续接受第二个地址上的连接,但第一个地址不再可用:它已被授予第一个子级。所以从这一点上,没有什么有用的。
        2
  •  0
  •   daotoad    15 年前

    是的,您可以用Perl来实现。

    perlipc , IO::Select , IO::Socket Beej's Guide to Network Programming .

        3
  •  0
  •   user80168    15 年前

    您可能会考虑在PoE中进行此操作—它是用于处理事件的异步库,因此它看起来非常适合该任务。

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

    在评论中,有人也提到了CORO/AnyEvent——我还没玩过,但你可能想看看。