-1

これは簡単な解決策かもしれませんが、基本的には、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");
    }
4

2 に答える 2

1

データを読み取る場合:

n = read(sockfd,buffer,BLOCKSIZE);
if (n < 0)
  error("Error: reading from socket.");
int checksum = checksumv(buffer,BLOCKSIZE);

read()配置されたバイト数を尊重する必要があります-返される前にバイト数bufferよりも少ない数を読み取る場合があります。BLOCKSIZE

また、チェックサムが送信された (または受信された) 場所もわかりません。ファイル データが送信されているだけです。チェックサムをどのように比較していますか?

最後に、TCP はストリーミング プロトコルであるため、ファイル データの前にサイズを送信するか、「帯域外」表示を行うなどして、ファイル データが終了したことを受信者に示す何らかの方法が必要です。

于 2013-04-30T06:31:42.917 に答える