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 正在"更改"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发送的。我相信这就是答案,令人沮丧的是,这些信息很少提供。
相关文章:
- 当套接字连接断开时检测C/C++Unix
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 套接字读取后,我在缓冲区中看到意外输入
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- (Winsock) UDP 接收工作正常,但同一套接字的发送失败
- C++ TCP 套接字通信 - 连接按预期工作,几秒钟后失败,没有收到新数据,read() 和 recv() 块
- 套接字 read() 函数在处理隧道时有时从不返回 0
- C++ 套接字 read() 有时在连接到服务器时返回 -1
- SOCAT,将TCP套接字转发到Unix套接字,将recvmsg()更改为read(),删除辅助数据
- read() 上的不同行为取决于写入不可写内存时表示文件、匿名管道或套接字的文件描述符
- 如何使用 read() 在C++套接字中接收超过 40Kb
- 将套接字的 read() 输出存储在 char 变量中
- 如何在Unix上的c++套接字上使用带有read()的超时
- TCP套接字:传入数据在ack之后(离开TCP读取缓冲区)但在read()/recv()之前的位置
- TCP套接字上的read()何时返回?