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

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

本文关键字:套接字 read 删除 数据 转发 Unix recvmsg SOCAT TCP      更新时间:2023-10-16

我正在使用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 套接字读取的程序的跟踪,我需要的数据是辅助数据中的 [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/正在进行读取系统调用的远程机器上的跟踪。请注意,它读取msg_iov数据(非辅助数据)。来自我的客户端的最顶级的recvmsg正在被我的远程机器上的socat转换为read()调用

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

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

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

相关文章: