LINUX.ORG.RU

как передать большой файл?

 bicycle, ,


0

1

есть большой (относительно, ~150 МБ) файлик. И его надо скачать по сети, используя самописную пограммку на крестах, используя sockets. Здравый смысл подсказывает, что нельзя сделать вот так

send (mysocket, foo, MAX_FILE_SIZE, 0)
, но разбить файлик на мелкие части, и пересылать понемногу, рассчитав по сколько байт будет посылаться за раз, с небольшой задержкой между циклами. Сеть, соответственно, 100/1000 Mbit. Какой должен быть максимально возможный размер пересылаемых за раз данных?

с++ не знаю но думаю тут не от скорости инета зависит, а от размера оперативки.

TDrive ★★★★★
()

Что-то мне подсказывает, что это зависит от MTU.

А задержку лучше не фиксировать, а ждать от получателя подтверждения получения перед посылкой следующего блока. Тогда алгоритм будет сам подстраиваться под загруженность сети.

KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 1)

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

Разбивать не надо. тсп сам разобьёт как надо.

Сделай ммап своему файлу и подсовывай send указатель с офсетом, который будешь сдвигать постоянно.

если надо только linux, используй sendfile, как указали выше.

nanoolinux ★★★★
()

Охренеть... В жопу С++! Они для этой задачи совсем не нужны. Используй например, libev. Когда сокет готов к записи пытаешся записать в него данные пока он не вернет размер меньше, чем ты пытаешся передать. После этого ждешь, пока он снова будет готов к записи. итд

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

В жопу С++! Они для этой задачи совсем не нужны. Используй например, libev

Человек лабу делает.

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

Тогда можно обойтись select в цикле. Ну или блокирующим режимом.

vromanov ★★★
()

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

Первое, лимит данных хранимых кернелом ограничен (это касательно MAX_FILE_SIZE). Во-вторых, если с сетью все нормально, пиши по 32-64кб. Обычно делают меньше от 512б до 8кб. С учетом буффера на чтение, оптимально брать 4к.

И решать лучше через mmap. Разницы как сдвигать офсет (по сравнению с read) - нет. Просто допишешь пару функций.

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

Да чего уж мелочится, давайте полностью TCP реализауем да и все тут.

trex6 ★★★★★
()

Здравый смысл подсказывает, что нельзя сделать вот так

А почему нет? Здравый смысл подсказывает, что ограничений тут быть не должно.

i-rinat ★★★★★
()

Ты что, наркоман? Не твоя забота заниматься расчётами таймингов. Просто читай из файла куски и пиши их в блокирующий сокет. На счёт размера блоков, сотни кб и до половины среднего размера tcp буфера.

mashina ★★★★★
()
Последнее исправление: mashina (всего исправлений: 1)
Ответ на: комментарий от gh0stwizard

Обычно делают меньше от 512б до 8кб. С учетом буффера на чтение, оптимально брать 4к.

не делают так, 4к слишком мало

mashina ★★★★★
()

Пересылай одним куском, ядро само раздолбит на куски в зависимости от размера TCP window.

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

Странно, когда я увидел твою аватарку, не читая еще, что ты написал, решил, что будет простыня на хаскеле, которая умеет пересылать файлы, считать факториал и еще какую-то муть)

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

могу sendfile на haskell, но там 1 импорт и 1 вызов будет.

qnikst ★★★★★
()

но разбить файлик на мелкие части, и пересылать понемногу...

... это если никуда не спешить.

int left = file_size;
int offset = 0;
while (0 < left) {
    int sent = send(fd, start + offset, left, 0);
    if (-1 != sent) {
        left -= sent;
        offset += sent;
    } else {
        // ...
    }
}

Операционная система сама разберётся как передать его побыстрее.

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

Асинхронность головного мозга детектед.

Можно, конечно, и более трудозатратные способы предложить.

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

Просто есть БОЛЬШОЙ опыт передачи и получения файлов по сети. Синхронный режим просто не рассматривается как тупиковый путь.

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

видимо, слишком БОЛЬШОЙ...

...чтобы решить простую практическую задачу.

Чем ТС хочет заниматься пока передача невозможна? И какого тогда передёргивать ядро? Возможно, на этом же хосте крутятся и другие программы, которые не прочь поработать.

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