Я пытаюсь получить какой-то файл через сокеты в C. Но сервер отправляет мне 64-байтовые пакеты, например, для файла размером 1000000 байт, и я получаю приблизительно 999902 байта в файле назначения.
while ((n = read(sd, buffer_in, BUFSIZE ))) // BUFSIZE = 64
{
if(n<0)
{
printf("Fail.\n");
fclose(archivo);
return -1;
}
if(fwrite(buffer_in, n, 1, f) !=1 )
{
printf("fwrite error.\n");
fclose(archivo);
return -1;
}
bytes+=n;
}
printf("We received %d bytes", bytes);
При использовании через локальный сокет TCP / IP он работает, но не при медленном соединении. Через отладку я вижу, что получаю много кусков по 64 байта и около 30 байтов около EOF. Я знаю, что вы можете получить меньше байтов в read (), поскольку вызов возвращается, когда доступны какие-либо данные (> 1 байт). Но это условие не должно быть поймано в то время? Должен возвращаться при n == 0, это больше не данные (EOF).
Спасибо за помощь.
(EDIT)
Отправка кода следующим образом:
while (n=read(file_fd, buffer, BUFSIZE))
{
write (sdaccept, buffer, n)
}
Я знаю, что read () и write () могут возвращать N
(РЕДАКТИРОВАТЬ II)
Протестировано с источником C с 10673 байтами, получает 10575 без повреждения, за исключением того, что файл назначения ОТСУТСТВУЕТ первые 98 байтов !!!