【发布时间】: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