Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在客户端用C-Binary diff编写的TFTP服务器显示了差异,但并不总是如此_C_Sockets_Cmp_Tftp - Fatal编程技术网

在客户端用C-Binary diff编写的TFTP服务器显示了差异,但并不总是如此

在客户端用C-Binary diff编写的TFTP服务器显示了差异,但并不总是如此,c,sockets,cmp,tftp,C,Sockets,Cmp,Tftp,我已经用C编写了一个tftp服务器。我使用的tftp客户端是本机linux客户端。文件传输似乎是正确的。发送和接收的文件大小似乎相同。但是如果我对两个文件都执行“cmp”,则会有差异。我附加了一个函数,它可以向客户端发送“512字节”或更少的数据。我不确定是否有任何填充物被引入,但我不知道这可能发生在哪里 void send_next_data (int client_id) { int opcode = 0; int block_id = 0; unsigned long bytes_left

我已经用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);
}
我使用
time dd if=/dev/uradom of=random file bs=1 count=xxxx
并发送它。对于77940字节的文件大小,cmp表示第一个差异出现在字节44393。任何帮助都将不胜感激

保存在客户端的代码呢?它是本机tftp linux客户端。我还没有给客户写信。所以我不认为会有什么问题。实际的角色有哪些不同?这是一个转义还是签名的问题?@Adamlis因为我正在用二进制文件测试,所以我不确定如何找到实际的字符
cmp-b
给出这个
随机文件../tftptest1/随机文件不同:字节44393,第175行是0^@377 M-^?
。我觉得没什么意义sense@AdamLiss谢谢,我知道了。我没有在客户端将模式设置为二进制。默认情况下,模式为netascii。谢谢你的指点
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);