C で tftp サーバーを作成しました。私が使用している 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 result;
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, &opcode, sizeof(uint16_t));
ptr += sizeof(uint16_t);
memcpy(ptr, &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, &client_list[client_id].file[offset], 512);
ptr += 512;
total_bytes += 512;
client_list[client_id].offset += 512;
}
else
{
memcpy(ptr, &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 *)&client_list[client_id].clientAddr, client_list[client_id].clientAddrLen);
printf(" total_bytes sent = %d, result = %d , client id = %d, send on fd = %d\n", total_bytes, result, client_id, socket_list[client_id]);
// printf(" Error = %d\n", 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 は、最初の diff がバイト 44393 にあることを示しています。助けていただければ幸いです。