SOCAT, переадресация сокета TCP на сокет Unix, изменение recvmsg() на read(), удаление вспомогательных данных

Я использую 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()?


person e wagness    schedule 29.05.2019    source источник
comment
Что выходит из ваших вызовов recvmsg() сокета Unix? Потому что TCP — это просто поток, и вся информация из sendmsg() собирается в один пакет и отправляется по соединению. См. этот вопрос и, в частности, этот ответ: для потокового сокета это в любом случае не имеет значения. Любые данные, которые вы отправляете, просто закончатся как один длинный поток данных на другой стороне.   -  person Andrew Henle    schedule 29.05.2019
comment
@AndrewHenle Я не уверен, что вы имеете в виду, моя проблема в том, что recvmsg НЕ вызывается для сокета unix. Приведенный выше пример recvmsg для сокета unix взят из написанной мной отдельной программы, которая напрямую считывает сокет unix. Что получается, так это [5], это дескриптор int/file. вместо этого read вызывается в сокете unix (при использовании socat), который, как я понимаю, игнорирует вспомогательные данные   -  person e wagness    schedule 29.05.2019
comment
Вы пытаетесь передать дескриптор файла целочисленного значения через сокет TCP, через socat и через сокет Unix? Или наоборот - через сокет Unix, потом через socat и потом через TCP соединение с удаленной машиной?   -  person Andrew Henle    schedule 29.05.2019
comment
@AndrewHenle Я думаю, что моя проблема может быть связана с python, и я открыл отдельный вопрос. Я пытаюсь читать из сокета unix, который отвечает на чтение целочисленным FD. Мой клиент удален (это функциональный тест), поэтому он не может работать локально на целевой машине с сокетом Unix. Поэтому вместо этого я пытаюсь использовать socat для переадресации сокета TCP в сокет Unix, поэтому мой клиент может «использовать» сокет TCP для чтения / recv в сокете unix с socat в качестве своего рода прокси.   -  person e wagness    schedule 29.05.2019


Ответы (1)


Вспомогательные данные не передаются по сети/через TCP. Я считаю, что это ответ, к сожалению, эта информация редко предоставляется.

person e wagness    schedule 30.05.2019