Я использую socat для пересылки сокета TCP в сокет домена unix
Вот пример команды:
socat TCP-LISTEN:<PORT> UNIX-CONNECT:<UNIX DOMAIN SOCKET>
Мне нужно прочитать вспомогательные данные из сокета, и моя проблема в том, что socat «меняет» вызовы recvmsg () (из моего сокета TCP) и обычные вызовы read () в сокете unix. Как я понимаю, вызов read () не может получить вспомогательные данные.
Мой (python) клиент удален и вызывает recvmsg в сокете tcp.
От одного моего клиента:
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 от моего клиента переводятся в вызовы read () с помощью socat на моей удаленной машине
read(5, "\360", 8192) = 1
read(5, "\252", 8192) = 1
Есть ли способ заставить socat не преобразовывать эти вызовы recvmsg в вызовы read ()?