Клиент читает больше байтов, чем было отправлено в C-linux

РЕДАКТИРОВАТЬ: я пытаюсь отправить файл с сервера клиенту. Когда я отправляю файл размером 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);
         }

Если потребуется больше кода, я опубликую его, дайте мне знать. Очень признателен за любую помощь!


person Darren Fernando    schedule 04.11.2020    source источник
comment
Отвечает ли это на ваш вопрос? c отправлять и получать файл   -  person David Cullen    schedule 04.11.2020
comment
@DavidCullen Это было очень полезно, но не совсем. Он говорит, что исправил это, сохранив размер файла в массиве символов, но это, похоже, не моя проблема. Я только что провел небольшую отладку, и для файла размером 44 байта при первой итерации записи в файл в цикле while он записывает 256 символов (что соответствует размеру buf), а затем продолжает записывать 44 байта перед остановка   -  person Darren Fernando    schedule 04.11.2020
comment
Должны ли мы интерпретировать ваш комментарий чуть выше как утверждение, что write(sd, buf, bytes_read) записывает более bytes_read байтов в файл (я полагаю, сокет), связанный с файловым дескриптором sd? Это кажется маловероятным. Но я не уверен, что еще с этим делать, потому что ваши операторы печати отладки наверняка сообщают вам значение bytes_read, поэтому вы бы описали проблему по-другому, если бы она включала чтение большего количества байтов из исходного файла, чем вы ожидали.   -  person John Bollinger    schedule 04.11.2020
comment
@JohnBollinger Нет, прошу прощения, если вы неправильно поняли. Что происходит, когда мой клиент читает содержимое файла здесь, этот первый оператор отладки printf("DEBUG B: read=%zd\n", bytes_read) говорит, что он читает 256 байтов, а на следующей итерации он читает 44 байта. Я просто хотел бы сначала прочитать 44 байта   -  person Darren Fernando    schedule 04.11.2020
comment
Единственная правдоподобная возможность, которую я вижу, заключается в том, что сервер отправляет дополнительный блок данных за пределы представленного кода сервера и до него, который клиент еще не прочитал. Также обратите внимание, что в случае, если клиент потерял синхронизацию с сервером, вполне вероятно, что он также неправильно прочитал ожидаемый размер файла, в том смысле, что байты, которые он принимает для размера файла, на самом деле были чем-то другим.   -  person John Bollinger    schedule 04.11.2020
comment
Оператор Debug print — проверенный метод, но он не должен быть единственным в вашем арсенале. Сокращение вашего кода до минимально воспроизводимого примера — это отличный метод отладки сам по себе, с дополнительным преимуществом, что если это не поможет вам решить проблему самостоятельно, тогда результат поможет нам лучше помочь вам. Также научитесь пользоваться отладчиком. Существуют также системные инструменты, которые иногда могут помочь; в Linux к ним относятся strace.   -  person John Bollinger    schedule 04.11.2020