Упаковка нескольких операций записи в один TCP-пакетLinux

Ответить
Anonymous
 Упаковка нескольких операций записи в один TCP-пакет

Сообщение Anonymous »

У меня есть последовательность вызовов send() для записи байтов в сокет TCP. Можно ли заставить сокет отправлять TCP-пакеты только тогда, когда они заполнены (превышают MTU) или я явно указываю, что закончил последовательный вызов send()?
В частности, у меня есть такой код:

Код: Выделить всё

// these are user-provided, I don't control these:

void* buf1;
size_t len1;
void* buf2;
size_t len2;
void* buf3;
size_t len3;

// I control this call sequence:

if (send(sck, buf1, len1, 0) < 0 ||
send(sck, buf2, len2, 0) < 0 ||
send(sck, buf3, len3, 0) < 0) {
...
}
И мне хотелось бы каким-то образом минимизировать количество отправляемых базовых пакетов.
Это можно сделать, создав промежуточный буфер, а затем все вызовы отправки, я мог бы затем вручную отправить этот буфер, но мне бы хотелось избежать создания промежуточного буфера, поскольку некоторые данные могут быть довольно большими и для этого потребуется дополнительная копия этих данных. Другими словами, я хочу отправить данные без копирования. Возможно ли это?
Примечание. Я знаю, что TCP не является пакетным протоколом. Я поискал и нашел ряд ответов, которые дают такой педантичный ответ, что пакеты на самом деле не существуют, и хотя это, возможно, семантически верно, это не особенно полезно, потому что под ними все еще есть IP-пакеты.

Подробнее здесь: https://stackoverflow.com/questions/790 ... tcp-packet
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»