TFTP-сервер, написанный на C — двоичном diff на стороне клиента, показывает разницу, но не всегда

#c #sockets #cmp #tftp

#c #сокеты #cmp #tftp

Вопрос:

Я написал сервер tftp на C. Клиент tftp, который я использую, является собственным клиентом Linux . Передача файлов, похоже, происходит правильно. Размеры отправленных и полученных файлов кажутся одинаковыми . Но если я делаю «cmp» для обоих файлов, есть разница. Я подключил функцию, которая отправляет клиенту «512 байт» данных или меньше. Я не уверен, вводится ли какое-либо дополнение, но я не знаю, где это может произойти.

 void send_next_data (int client_id)
{
int opcode = 0;
int block_id = 0;
unsigned long bytes_left = 0;
unsigned long offset = 0;
unsigned long file_length = 0;
char *ptr = buffer_send;
int total_bytes = 0;
int resu<
int i;


opcode = 3;
client_list[client_id].prev_blockid  = 1;
block_id = client_list[client_id].prev_blockid;

opcode = htons(opcode);
block_id = htons(block_id);
bzero(buffer_send,520);

memcpy(ptr, amp;opcode, sizeof(uint16_t));
ptr  = sizeof(uint16_t);

memcpy(ptr, amp;block_id, sizeof(uint16_t));
ptr  = sizeof(uint16_t);

total_bytes  = 4;

offset = client_list[client_id].offset;
file_length =  client_list[client_id].file_length;

if(offset < file_length)
{
    bytes_left = file_length - offset;
    if(bytes_left > 512)
    {
        memcpy(ptr, amp;client_list[client_id].file[offset], 512);
        ptr  = 512;
        total_bytes  = 512;
        client_list[client_id].offset  = 512;
    }
    else
    {
        memcpy(ptr, amp;client_list[client_id].file[offset], bytes_left);
        ptr  = bytes_left;
        total_bytes  = bytes_left;
        client_list[client_id].offset  = bytes_left;
    }
}


result = sendto(socket_list[client_id], buffer_send, total_bytes, 0 , (struct sockaddr *)amp;client_list[client_id].clientAddr, client_list[client_id].clientAddrLen);
printf(" total_bytes sent = %d, result = %d , client id = %d, send on fd = %dn", total_bytes, result, client_id, socket_list[client_id]);
    //  printf(" Error = %dn", errno);
}
  

Я копирую данные из двоичного файла в буфер, а затем использую смещения в этом буфере для передачи 512 или менее байтов данных . Чтобы проверить, правильно ли файл скопирован в буфер, я записал этот буфер обратно в «тестовый» файл, и cmp между исходным и этим «тестовым» файлом говорит, что разницы нет.

 fseek(fp, 0L, SEEK_END);
client_list[n].file_length = ftell(fp);
fseek(fp, 0L, SEEK_SET);

client_list[n].file = malloc((client_list[n].file_length 100) * sizeof(char));

bzero(client_list[n].file, client_list[n].file_length 100);
i=0;
    c = getc(fp) ;
while (!(feof(fp)))
{
   client_list[n].file[i] = c;
   c = getc(fp);
   i  ;
}

printf(" Number of bytes read from file = %ld , size of file = %ld n", i, client_list[n].file_length);

send_next_data(n);

fclose(fp);

fp = fopen("test", "wb");
fwrite(client_list[n].file, 1,client_list[n].file_length ,fp);
fclose(fp);
  

Я генерирую двоичные файлы, используя
time dd if=/dev/urandom of=random-file bs=1 count=xxxx и отправляя их. Для файла размером 77940 байт cmp сообщает, что первая разница появляется в байте 44393 . Любая помощь будет оценена.

Комментарии:

1. Как насчет кода, который сохраняется на стороне клиента?

2. Это собственный клиент tftp linux . Я не написал клиента. Так что я не ожидаю проблем там.

3. Какие фактические символы отличаются? Это вопрос экранирования или подписи?

4. @AdamLiss Поскольку я тестирую с двоичными файлами, я не уверен, как найти фактические символы. cmp -b дает это random-file ../tftptest1/random-file differ: byte 44393, line 175 is 0 ^@ 377 M-^? . Я не думаю, что это имеет большой смысл

5. @AdamLiss Спасибо, я все понял . Я не устанавливал режим как двоичный на стороне клиента. По умолчанию режим был netascii . Спасибо за подсказку