【问题标题】:SOCAT, forwarding TCP socket to a Unix Socket, changes recvmsg() to read(), drops ancillary dataSOCAT,将 TCP 套接字转发到 Unix 套接字,将 recvmsg() 更改为 read(),丢弃辅助数据
【发布时间】:2019-05-29 16:33:07
【问题描述】:

我正在使用 socat 将 TCP 套接字转发到 unix 域套接字

这是一个示例命令:

socat TCP-LISTEN:<PORT> UNIX-CONNECT:<UNIX DOMAIN SOCKET>

我需要从套接字中读取辅助数据,而我的问题是 socat 正在“更改”recvmsg() 调用(来自我的 TCP 套接字),以及 unix 套接字上的正常 read() 调用。据我了解,read() 调用无法获取辅助数据。

我的 (python) 客户端是远程的,并在 tcp 套接字上调用 recvmsg。

来自我的客户:

recvmsg(3, {msg_name(0)=0x7ffc14322490, msg_iov(1)=[{"\360", 1}], msg_controllen=0, msg_flags=0}, 0) = 1
recvmsg(3, {msg_name(0)=0x7ffc14322490, msg_iov(1)=[{"\252", 1}], msg_controllen=0, msg_flags=0}, 0) = 1

这是一个直接从unix套接字读取的程序的strace,我需要的数据是辅助数据中的[5]。这就是我希望远程机器上的 strace 的样子:

recvmmsg(3, {{
{msg_name(0)=NULL, msg_iov(1)=[{"\360", 1}], msg_controllen=20, [{cmsg_len=20, cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, [5]}], msg_flags=0}, 1}, {
{msg_name(0)=NULL, msg_iov(1)=[{"\252", 1}], msg_controllen=20, [{cmsg_len=20, cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, [6]}], msg_flags=0}, 1}, {

这是运行 socat / 正在执行读取系统调用的远程处理的 strace。请注意,它读取 msg_iov 数据(非辅助数据)。我的客户端的最顶级的 recvmsg 正在我的远程计算机上的 socat 转换为 read() 调用

read(5, "\360", 8192)                   = 1
read(5, "\252", 8192)                   = 1

有没有办法让 socat 不会将这些 recvmsg 调用更改为 read() 调用?

【问题讨论】:

  • 您的 Unix 套接字 recvmsg() 调用会产生什么?因为 TCP 只是一个流,来自sendmsg() 的所有信息都被收集到一个数据包中并通过连接发送。请参阅this question,尤其是this answer:“对于流套接字,无论哪种方式都无关紧要。您发送的任何数据最终都将成为另一端的一个长数据流。”
  • @AndrewHenle 我不确定你的意思,我的问题是在 unix 套接字上没有调用 recvmsg。我上面关于 unix 套接字的 recvmsg 的示例来自我编写的一个单独的程序,它直接读取 unix 套接字。出来的是 [5],它是一个 int / 文件描述符。但是,在 unix 套接字上调用了 read(当使用 socat 时),据我所知,它忽略了辅助数据
  • 您是否尝试通过 TCP 套接字、socat 和 Unix 套接字传递整数值文件描述符?或者相反 - 通过 Unix 套接字,然后通过 socat,然后通过 TCP 连接到远程机器?
  • @AndrewHenle 我认为我的问题可能与python有关,我已经打开了一个单独的问题。我正在尝试从 unix 套接字读取,该套接字使用整数 FD 回复读取。我的客户端是远程的(它是一个功能测试),所以它不能在带有 Unix 套接字的目标机器上本地运行。因此,相反,我尝试使用 socat 将 TCP 套接字转发到 Unix 套接字,因此我的客户端可以“使用” TCP 套接字以 socat 作为代理在 unix 套接字上读取/接收。

标签: c++ unix networking tcp socat


【解决方案1】:

辅助数据不通过有线/通过 TCP 发送。这就是我相信的答案,令人沮丧的是,很少提供此信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 2018-08-29
    • 2016-05-14
    相关资源
    最近更新 更多