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

Dan*_*nny 2 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
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢.

eph*_*ent 6

颠倒你的参数的顺序socat,它的工作原理.

socat -v tcp-l:6666,reuseaddr,fork unix:/var/lib/mysql/mysql.sock
Run Code Online (Sandbox Code Playgroud)

这指示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
Run Code Online (Sandbox Code Playgroud)

不行,因为这个指示socat

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