套接字校验和问题



这可能是一个直接的解决方案,但基本上我是使用TCP将二进制文件一块一块地发送到另一个程序,并检查以确保校验和匹配有效性。问题是收到的校验和永远不是发送的校验和,除了提交的最后一部分(剩余部分)。

发送方的代码片段为:

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");
    }

读取数据时:

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

你需要尊重read()说它放入buffer的字节数-它可能在返回前读取少于BLOCKSIZE的字节数。

同样,我看不到校验和发送(或接收)的位置——我只看到正在发送的文件数据。如何比较校验和?

最后,因为TCP是一个流协议,你需要有一些方法来指示接收方何时文件数据完成,比如通过发送文件数据的大小,或者有一些"带外"指示。

您没有正确地累积校验和,但是您不需要仅仅复制一个文件就这么复杂:

byte buffer[8192];
while ((count = fread(buffer, sizeof buffer, 1, fp)) > 0)
{
    n = write(sock,buffer4,count);
    if (n < 0)
      error("ERROR writing to socket");
    checksum += checksumv(buffer, count); // or possibly ^=, it depends how your checksum is supposed to accumulate
}

最新更新