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

时间:2019-05-29 16:33:07

标签: c++ unix networking tcp socat

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

这是一个示例命令:

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

我需要从套接字读取辅助数据,而我的问题是socat正在(从我的TCP套接字)“更改” recvmsg()调用,以及在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()调用?

1 个答案:

答案 0 :(得分:0)

辅助数据未通过TCP /网络发送。多数民众赞成在我认为的答案,令人沮丧的是很少提供此信息。