SOCAT,将 TCP 套接字转发到 Unix 套接字,将 recvmsg() 更改为 read(),删除辅助数据

SOCAT, forwarding TCP socket to a Unix Socket, changes recvmsg() to read(), drops ancillary data

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

这是一个示例命令:

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

我需要从套接字中读取辅助数据,我的问题是 socat 是 'changing' recvmsg() 调用(从我的 TCP 套接字),以及 unix 套接字上的正常 read() 调用.据我了解,read() 调用无法获取辅助数据。

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

来自我的客户:

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

这里是一个直接从unix socket读取的程序的strace,我需要的数据是辅助数据中的[5]。这就是我希望我的远程机器上的 strace 看起来像:

recvmmsg(3, {{
{msg_name(0)=NULL, msg_iov(1)=[{"0", 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)=[{"2", 1}], msg_controllen=20, [{cmsg_len=20, cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, [6]}], msg_flags=0}, 1}, {

这是远程机器上的一个 strace,其中 socat 运行/正在进行读取系统调用。请注意,它读取 msg_iov 数据(非辅助数据)。来自我客户端的最重要的 recvmsg 正在被我的远程机器上的 socat 翻译成 read() 调用

read(5, "0", 8192)                   = 1
read(5, "2", 8192)                   = 1

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

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