Как читать из сокета прямо в файл
В C (или C++) есть способ получать данные из сокета, но вместо того, чтобы читать их в буфер в памяти, он «получает» их в файл. Я знаю, что обычный способ сделать это — получить данные в буфер символов, а затем записать буфер в файл.
Существует ли такая функция, как sendfile(), которая передает данные непосредственно между файлами и сокетами, но вместо отправки данных из файла в сокет она получает данные из сокета в файл?
1 ответ
Нет эквивалента sendfile, который работал бы наоборот. Но есть функция splice() , которая осуществляет передачу между двумя файловыми дескрипторами, один из которых должен ссылаться на файл.
Итак, что вы можете сделать, это сокет -> труба, труба -> файл. Является ли это преимуществом над буфером, вы должны измерить. Сращивание ограничено размером буфера конвейера, в то время как чтение/запись может работать в произвольных единицах, уменьшая количество системных вызовов.