LINUX.ORG.RU

Свободное место буфера отправки сокета


0

1

Добрый день.

Есть 2 сокета (А) и (В). Данные, котор приходят в один сокет(А), записываю в другой(В). Типа прокси.
Если бы знал размер буфера отправки (В), было бы понятно сколько данных извлекать (ресивить) из (А). Иначе приходится городить буфера и т.д

Можно ли узнать размер свободного места буфера отправки сокета?

Спасибо.

man 2 recv man 2 select man 2 poll

из этого собрать кусок кода, которому без разницы на буфер отправляющей стороны.

пока(естьДанные(сокет_приемник)) {
    принять(сокет_приемник, буфер, размер_принятого, флаги);
    отправить(сокет_отправщик, буфер, размер_принятого, флаги)
}

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

Если читаем данные из сокета(А) в свой буфер, а он «не влез» в буфер отправки (В) или влез не полностью, то буфер придется запоминать вместе с числом записанных байт.

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

Хочу уточнить о splice(). На (А) приходят данные, а в буфере отправки (В) свободного места меньше, чем нужно скопировать из (А). Если splice извлекает из (А) столько данных, сколько влезет в (В), то это то, что мне нужно. Так ли это?

nitroxolyne
() автор топика

Если не splice(), то попробуйте использовать getsockopt() + ioctl(SIOCOUTQ). Но и splice(), и SIOCOUTQ отсутствуют в стандартах. Для freebsd, например, для этого используется ioctl(FIONSPACE).

Sorcerer ★★★★★
()
Ответ на: комментарий от nitroxolyne

Так ли это?

Конечно. А иначе он бы не был нужен.

true_admin ★★★★★
()
Ответ на: комментарий от mmarkk

В один ход не сделает. один из дескрипторов должен быть пайпом же.

вот чёрт, теперь я понимаю почему сырцы во всех примерах такие костыльные. Слава линуксу, блин.

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

я у них реквестировал просьбу чтобы сделали без промежуточного пайпа. Из любого fd в любой. сказали - тебе надо - ты и сделай. В общем-то как обычно. И да, слава линуксу.

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

1. A -> Pipe (сколько получится у ядра)

2. Pipe -> B (сколько получится у ядра)

То есть, вместо своего буфера используй буфер пайпа в ядре. Так даже значительно быстрее. Типа технология zero-copy. Размер пайпа по дефолту 65 кб.

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