Я использую 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()?
recvmsg()
сокета Unix? Потому что TCP — это просто поток, и вся информация изsendmsg()
собирается в один пакет и отправляется по соединению. См. этот вопрос и, в частности, этот ответ: для потокового сокета это в любом случае не имеет значения. Любые данные, которые вы отправляете, просто закончатся как один длинный поток данных на другой стороне. - person Andrew Henle   schedule 29.05.2019socat
и через сокет Unix? Или наоборот - через сокет Unix, потом черезsocat
и потом через TCP соединение с удаленной машиной? - person Andrew Henle   schedule 29.05.2019