【问题标题】:How can I map a local unix socket to an inet socket?如何将本地 unix 套接字映射到 inet 套接字?
【发布时间】:2009-05-21 16:09:48
【问题描述】:

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

我进行了大量搜索,但我确实找到了socat,据称它可以满足我的需求。我想知道是否有人对如何实现这一点有任何建议。我一直在使用的命令行(部分成功)是:

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

现在我可以建立连接并与服务器对话。不幸的是,任何建立多个连接的尝试都失败了,因为我需要使用 fork 选项,但这个选项似乎使连接不起作用。

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

    将你的参数顺序颠倒到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. 在两个端点之间传输数据,然后退出。

    反过来写

    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. 父级继续接受第二个地址上的连接,但不再有第一个地址可用:它已提供给第一个子级。所以从现在开始,什么都做不了了。

    【讨论】:

    • 谢谢,这正是我想要的。太棒了,这是多么愚蠢的错误。
    【解决方案2】:

    是的,你可以在 Perl 中做到这一点。

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-09
        • 1970-01-01
        • 1970-01-01
        • 2018-06-10
        • 1970-01-01
        • 1970-01-01
        • 2013-01-30
        • 1970-01-01
        相关资源
        最近更新 更多