Предполагается, что каждый read
возвращает количество байтов, которые вы хотите прочитать. Это неверно. Вы всегда должны проверять возвращаемое значение read
, чтобы убедиться, что вы получили столько байтов, сколько хотели.
Это также означает, что вы можете переписать ваш цикл отправки как:
int bytesLeft = file_length;
char buf[1024]; //no need to reallocate it in the loop
while(bytesLeft > 0)
{
int to_read = 1024;
if(bytesLeft < to_read)
to_read = bytesLeft
int bytesRead = read(new_sock_id, buf, to_read);
if(error("reading file", false)) continue;
write(file, buf, bytesRead);
if(error("writing file", false)) continue;
bytesLeft -= bytesRead ;
}