РЕДАКТИРОВАТЬ: я пытаюсь отправить файл с сервера клиенту. Когда я отправляю файл размером 44 байта, клиент читает 256 байтов на первой итерации (что соответствует размеру массива символов buf), а на следующей итерации читает оставшиеся 44 байта. Почему он изначально не читает 44 байта?
Фрагмент клиента (получает файл):
while((bytes_read = read(sd, buf, sizeof(buf))) > 0){ //receving file contents and writing to file
printf("DEBUG B: read=%zd\n", bytes_read);
fwrite(buf, 1, bytes_read, fp);
total_bytes_read += bytes_read;
printf("DEBUG C: total=%zu\n", total_bytes_read);
if(ferror(fp)){
perror("Error when writing to file\n");
exit(1);
fclose(fp);
}
//printf("Filesize is: %zu \n", filesize);
if(total_bytes_read == filesize){
break;
}
}
printf("The client has received the file\n");
}
серверная часть (отправляет файл):
strcpy(buf, "no issues");
if((y = write(sd, buf, sizeof(buf))) < 0){
perror("Error reporting back to client\n");
}
fseek(fp, 0, SEEK_END);
filesize = ftell(fp);
fseek(fp, 0, SEEK_SET);
printf("Sending file size\n");
if((write(sd, &filesize, sizeof(filesize))) < 0){ //sending filesize
printf("error sending file size\n");
}
printf("Filesize is: %zu \n", filesize);
printf("Sending file\n");
while((bytes_read = fread(buf, 1, sizeof(buf), fp)) > 0){ //sending file contents
printf("DEBUG A: Bytes read %zu \n", bytes_read);
if ((bytes_written = write(sd, buf, bytes_read)) < 0){
printf("Error sending server file.\n");
}
printf("DEBUG B: Bytes sent %zu \n", bytes_written);
total_bytes_sent += bytes_written;
printf("Total bytes sent %zi \n", total_bytes_sent);
}
printf("File has been sent\n");
fclose(fp);
}
Если потребуется больше кода, я опубликую его, дайте мне знать. Очень признателен за любую помощь!
write(sd, buf, bytes_read)записывает болееbytes_readбайтов в файл (я полагаю, сокет), связанный с файловым дескрипторомsd? Это кажется маловероятным. Но я не уверен, что еще с этим делать, потому что ваши операторы печати отладки наверняка сообщают вам значениеbytes_read, поэтому вы бы описали проблему по-другому, если бы она включала чтение большего количества байтов из исходного файла, чем вы ожидали. - person John Bollinger   schedule 04.11.2020printf("DEBUG B: read=%zd\n", bytes_read)говорит, что он читает 256 байтов, а на следующей итерации он читает 44 байта. Я просто хотел бы сначала прочитать 44 байта - person Darren Fernando   schedule 04.11.2020strace. - person John Bollinger   schedule 04.11.2020