SOCAT, перенаправляя TCP-сокет в Unix-сокет, изменяет recvmsg () на read (), отбрасывает вспомогательные данные - PullRequest
0 голосов
/ 29 мая 2019

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

1 Ответ

0 голосов
/ 30 мая 2019

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

...