LINUX.ORG.RU

Странное поведение recvmsg

 , , ,


0

1

Есть 2 бинарных программмы, общающиеся через локальные tcp-сокеты. Одна из них (сервер) всунута глубоко в android-приложение и её нужно переписать. Всё, что она делает - отвечает одинаковыми сообщениями.
Отловил сообщение через strace и пытаюсь в точности воспроизвести его. Используются sendmsg и recvmsg на обеих сторонах.
Но вот незадача: recvmsg на клиенте пытается принять 8 байт (таково значение iovec_len, а принимает только 6. То есть, strace показывает только 6 байт сообщения и резултат тоже равен 6
Если в sendmsg на написанном сервере указывать 8, то клиент успешно читает 8 байт и его это не устраивает.
Если указать 6, на клиент всё равно принимает 8, причём в последние 2 байта попадает начало сообщения, что его тоже не устраивает.
И ещё: какая-то старая версия strace показывала 8 байт и нули в конце, хотя результат всё равно 6. Видимо, там strace полагался на iovec_len.
Пробовал пробрасывать подключение к android через ssh, что исключает посторонние факторы, через него всё работает, так что дело именно в какой-то хитрой отправке сообщения
tcpdump в обоих случаях выдаёт, что длина сообщения 6.

★★★★★

Ответ на: комментарий от mittorn
       MSG_WAITALL (since Linux 2.2)
              This flag requests that  the  operation  block  until  the  full
              request  is  satisfied.  However, the call may still return less
              data than requested if a signal is caught, an error  or  discon‐
              nect  occurs,  or the next data to be received is of a different
              type than that returned.

?

Deleted ()
Ответ на: комментарий от Deleted

Вроде разобрался. У меня сообщения принимались и отсылались в цикле, а второй recvmsg не блокировался, после чего второе сообщение приклеивалось к первому.

mittorn ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.