C 套接字校验和问题

C 套接字校验和问题,c,sockets,tcp,checksum,C,Sockets,Tcp,Checksum,这可能是一个简单的解决方案,但基本上我会使用TCP将一个二进制文件逐段发送到另一个程序,并进行检查以确保校验和匹配的有效性。问题在于,收到的校验和与提交的最后一部分(剩余部分)的校验和不同 发送方的代码片段为: void* buffer = (void *)malloc(BLOCKSIZE+1); if (!buffer) error("Error: malloc error for buffer.\n"); fread(buffer, BLOCKSIZE, 1, fp_read); //

这可能是一个简单的解决方案,但基本上我会使用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");
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");
    }
void*buffer=(void*)malloc(BLOCKSIZE+1);
如果(!缓冲区)
错误(“错误:缓冲区的malloc错误。\n”);
fread(缓冲区,块大小,1,fp_读取)//从当前块的二进制文件中读取。
int checksum=校验和(缓冲区、块大小);
n=写入(sockfd、缓冲区、块大小);
if(n<0)
错误(“写入套接字时出错”);
对于接收器是:

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);
void*buffer=(void*)malloc(BLOCKSIZE+1);
如果(!缓冲区)
错误(“错误:缓冲区的malloc错误。\n”);
n=读取(sockfd、缓冲区、块大小);
if(n<0)
错误(“错误:从套接字读取”);
int checksum=checksumv(缓冲区、块大小);
有人看到它有什么问题吗?校验和匹配的唯一部分是最后一个没有完全填满缓冲区的部分

谢谢

发件人的完整代码为:

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");
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");
    }
FILE*fp_read=fopen(“FILE.jpg”、“rb”);
if(fp_read==NULL)
错误(“无法打开文件进行对等工件下载”);
fseek(fp_read,0,SEEK_END);
无符号长文件长度=ftell(fp_读取);
fseek(fp_read,0,SEEK_SET);
int校验和,循环=fileLen/BLOCKSIZE;
整型余数=fileLen%BLOCKSIZE;
int段_num=循环+1;
void*buffer4=(void*)malloc(BLOCKSIZE+1);
如果(!buffer4)
错误(“错误:缓冲区的malloc错误。\n”);
int i,sent=0;
对于(i=1;i 0)
{
//分配内存
void*buffer5=(void*)malloc(余数+1);
如果(!buffer5)
错误(“错误:缓冲区2的malloc错误。\n”);
fread(缓冲区5,余数,1,fp_读取);
校验和=checksumv(缓冲区5,余数);
n=写入(sock、buffer5、余数);
if(n<0)
错误(“写入套接字时出错”);
}

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

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
}
字节缓冲区[8192];
而((count=fread(buffer,sizeof buffer,1,fp))>0)
{
n=写入(sock、buffer4、count);
if(n<0)
错误(“写入套接字时出错”);
checksum+=checksumv(缓冲区,计数);//或者可能是^=,这取决于您的校验和应该如何累积
}

读取数据时:

n = read(sockfd,buffer,BLOCKSIZE);
if (n < 0)
  error("Error: reading from socket.");
int checksum = checksumv(buffer,BLOCKSIZE);
n=读取(sockfd、缓冲区、块大小);
if(n<0)
错误(“错误:从套接字读取”);
int checksum=checksumv(缓冲区、块大小);
您需要考虑
read()
所说的放入
缓冲区的字节数
-返回前,它可能读取的字节数小于
BLOCKSIZE

此外,我看不到校验和发送(或接收)的位置-我只看到发送的文件数据。你如何比较校验和


最后,由于TCP是一种流协议,您需要有一些方法来指示接收方何时完成文件数据,例如发送文件数据之前的大小,或者有一些“带外”指示。

write(sockfd、buffer、BLOCKSIZE+1)
如果您只读
BLOCKSIZE
字节,为什么要告诉
write
写入
BLOCKSIZE+1
字节?(你甚至没有检查返回值!)我用n变量检查了返回值。另外,将其更改为写入(sockfd、buffer、BLOCKSIZE);仍然存在校验和不匹配问题。我只是在处理不同的事情。我指的是
fread
的返回值。顺便说一下,
int checksum=校验和(缓冲区、块大小)
不应编译,新声明的变量名会隐藏函数名。虽然编码设计不好,但fread确实读取了我想要的数据(通过print语句检查)。实际的校验和函数名是checksumv(),它会编译。“写入的字节数可能小于count”