2017-01-16 6 views
0

Мне нужно прочитать двоичный файл на моем веб-сервере и отправить его клиенту через TCP. Я решил прочитать его кусками. Как мне это сделать?Чтение двоичного файла с помощью chunk в буфер памяти в C

Мой код с fgets работает только с текстовыми файлами (код, который проверяет возвращаемые значения опущен):

char buf[2048]; 

fgets(buf, sizeof(buf), fp); 
while (!feof(fp)) 
{ 
    Server_TCP_Send(socket, buf, strlen(buf)); 
    fgets(buf, sizeof(buf), fp); 
} 
fclose(fp); 
+1

Не используйте 'fgets' и' strlen' для двоичных данных, поскольку они не могут обрабатывать его (из-за встроенных нулей в двоичных данных). Используйте 'read' или' fread'. – kaylum

ответ

5

Использование fread() вместо fgets(), и обратить внимание на возвращаемое значение:

char buf[2048]; 
size_t buflen; 

while (1) { 
    buflen = fread(buf, 1, sizeof(buf), fp); 
    if (buflen < 1) { 
     if (!feof(fp)) { 
      // a read error occured... 
     } 
     break; 
    } 
    Server_TCP_Send(socket, buf, buflen); 
} 
fclose(fp); 

В качестве альтернативы, некоторые платформы имеют функции отправки файлов по сокету. Например, sendfile() на Linux, или TransmitFile() на Windows.

+0

Большое спасибо. Оно работает. – MrOnlineCoder