3

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

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

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

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

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

谢谢。

4

3 回答 3

8

将参数的顺序颠倒到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. 打开到/var/lib/mysql/mysql.sock套接字的 UNIX 域连接。
  2. 侦听 TCP 端口 6666(使用SO_REUSEADDR
  3. 等待接受连接
  4. 建立连接后,生成一个工作子进程以在两个地址之间传输数据。
  5. 父级继续接受第二个地址上的连接,但不再有第一个地址可用:它已提供给第一个子级。因此,从这一点开始,没有什么有用的事情可以做。
于 2009-05-21T21:29:49.803 回答
0

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

查看perlipcIO::SelectIO::SocketBeej 的网络编程指南

于 2009-05-21T17:17:26.193 回答
0

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

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

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

于 2009-05-21T19:15:10.387 回答