これは簡単な解決策かもしれませんが、基本的には、TCP を使用してバイナリ ファイルを別のプログラムに 1 つずつ送信し、チェックサムが有効であることを確認しています。問題は、受信したチェックサムが、送信された最後の部分 (残り) とは別に送信されたチェックサムではないことです。
送信者のコード フラグメントは次のとおりです。
void* buffer = (void *)malloc(BLOCKSIZE+1);
if (!buffer)
error("Error: malloc error for buffer.\n");
fread(buffer, BLOCKSIZE, 1, fp_read); //read from binary file for the current block.
int checksum = checksum(buffer,BLOCKSIZE);
n = write(sockfd,buffer,BLOCKSIZE);
if (n < 0)
error("ERROR writing to socket");
レシーバーの場合は次のとおりです。
void* buffer = (void *)malloc(BLOCKSIZE+1);
if (!buffer)
error("Error: malloc error for buffer.\n");
n = read(sockfd,buffer,BLOCKSIZE);
if (n < 0)
error("Error: reading from socket.");
int checksum = checksumv(buffer,BLOCKSIZE);
誰かがそれで何か問題があると思いますか?チェックサムが一致する唯一の部分は、バッファを完全に満たしていない最後の部分です。
ありがとう。
送信者のコード全体は次のとおりです。
FILE* fp_read = fopen("file.jpg", "rb");
if (fp_read == NULL)
error("Cannot open the file for peer piece download.");
fseek(fp_read, 0, SEEK_END);
unsigned long fileLen = ftell(fp_read);
fseek(fp_read, 0, SEEK_SET);
int checksum, loops = fileLen / BLOCKSIZE;
int remainder = fileLen % BLOCKSIZE;
int segment_num = loops+1;
void* buffer4 = (void *)malloc(BLOCKSIZE+1);
if (!buffer4)
error("Error: malloc error for buffer.\n");
int i, sent = 0;
for (i=1; i<=loops; i++)
{
fread(buffer4, BLOCKSIZE, 1, fp_read);
checksum = checksumv(buffer4,BLOCKSIZE);
n = write(sock,buffer4,BLOCKSIZE);
if (n < 0)
error("ERROR writing to socket");
}
if (remainder > 0)
{
//Allocate memory
void* buffer5 = (void *)malloc(remainder+1);
if (!buffer5)
error("Error: malloc error for buffer2.\n");
fread(buffer5, remainder, 1, fp_read);
checksum = checksumv(buffer5,remainder);
n = write(sock,buffer5,remainder);
if (n < 0)
error("ERROR writing to socket");
}