Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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
File 通过UDP发送时,文件大小不同_File_Sockets_Udp - Fatal编程技术网

File 通过UDP发送时,文件大小不同

File 通过UDP发送时,文件大小不同,file,sockets,udp,File,Sockets,Udp,当我尝试在我编写的简单服务器和客户端应用程序之间传输文件时,我遇到了问题。文件传输成功,但接收端(服务器端)的文件大小不同。 我在客户端打开文件,使用fseek()查找文件的大小。然后我使用fread()将其读入char类型的缓冲区。我使用sendto()发送此缓冲区,因为我必须使用UDP套接字。 在服务器端,我使用recvfrom()来存储它,并使用fwrite()将其写入另一个文件。但当我检查文件的大小时,它要大得多。此外,我无法打开它,即使它应该是一个文本文件。 你能给我指点一下哪里可能会

当我尝试在我编写的简单服务器和客户端应用程序之间传输文件时,我遇到了问题。文件传输成功,但接收端(服务器端)的文件大小不同。 我在客户端打开文件,使用fseek()查找文件的大小。然后我使用fread()将其读入char类型的缓冲区。我使用sendto()发送此缓冲区,因为我必须使用UDP套接字。 在服务器端,我使用recvfrom()来存储它,并使用fwrite()将其写入另一个文件。但当我检查文件的大小时,它要大得多。此外,我无法打开它,即使它应该是一个文本文件。 你能给我指点一下哪里可能会出错吗?这也是通过套接字发送文件的最佳方式吗?是否有更好的方法发送文件

谢谢

客户端代码

//Writing code to open file and copy it into buffer
        fseek(fp, 0, SEEK_END);
        size_t file_size = ftell(fp);
        fseek(fp, 0, SEEK_SET);
        if(fread(file_buffer, file_size, 1, fp)<=0)
        {
            printf("Unable to copy file into buffer! \n");
            exit(1);
        }

        //Sending file buffer
        if(sendto(sock, file_buffer, strlen(file_buffer), 0, (struct sockaddr *) &serv_addr, serv_len)<0)
        {
            printf("Error sending the file! \n");
            exit(1);
        }
        bzero(file_buffer, sizeof(file_buffer));
//编写代码以打开文件并将其复制到缓冲区
fseek(fp,0,SEEK_END);
大小文件大小=ftell(fp);
fseek(fp,0,SEEK_集);

如果(fread(file\u buffer,file\u size,1,fp)代码有几个问题

在发件人中:

  • 如何分配
    文件\u缓冲区
    ?如果文件比缓冲区大,该怎么办?(可能这并不是造成当前问题的原因。)


  • 您只需检查
    fread
    的返回值是否为
    代码有几个问题

    在发件人中:

    • 如何分配
      文件\u缓冲区
      ?如果文件比缓冲区大,该怎么办?(可能这并不是造成当前问题的原因。)


    • 您只需检查
      fread
      的返回值是否为
      使用
      diff
      工具查看文件的不同之处。然后利用这些知识找出可能引入错误的地方:例如,某个地方的off by one是刚刚跳过的整个数据包大小的部分吗?记住:UDP不能保证数据包传递,因此f切换到TCP“解决”(或更改)观察到的问题..您使用的是什么代码?而且,他们不会无缘无故地将UDP称为不可靠的数据报协议
      。如果可能的话,最好只使用TCP连接。@pst我确信这个问题不是由UDP的使用引起的。我觉得错误在于我打开、复制和传输fi的实现中le.我只发送了较小的文件大小来检查我的程序。问题是,即使我发送了13 Kb的文件,它也会显示为30KB或40KB。@marinus我会将我编写的代码添加到我的原始问题中。@Bararuloke切换到TCP。比较。然后使用TCP或通过UDP重新创建TCP。有些人喜欢不同颜色的轮子。我看不出这有什么意义:)使用
      diff
      工具查看文件的不同之处。然后利用这些知识找出可能引入错误的地方:例如,某个地方的一个off by one是否跳过了整个数据包大小的部分?请记住:UDP不能保证数据包的传输,因此,如果切换到TCP“解决”(或更改)了观察到的问题..您使用的代码是什么?此外,他们也不会无缘无故地调用UDP
      不可靠的数据报协议。如果可能的话,最好只使用TCP连接。@pst我确信这个问题不是由UDP引起的。我觉得错误在我打开、复制和传输文件的过程中。我只发送了小文件来检查我的程序。问题是,即使我发送了13 Kb的文件,它也会显示为30KB或40KB。@marinus我会将我编写的代码添加到我的原始问题中。@Bararuloke切换到TCP。比较一下。然后使用TCP或通过UDP重新创建TCP。有些人喜欢不同颜色的轮子。我看不出这有什么意义:)非常好,但是“返回值可以是小于文件完整大小的任何值”只有在发生EOF时才是真的。如果发生错误,返回值将为-1,并且将伴随
      errno
      @Celada谢谢。这些愚蠢的错误:(.我在客户端传递了
      文件大小
      值,然后将从
      recvfrom
      调用返回的值用于我的
      写入
      。现在一切正常。目前,我正在为我的
      文件缓冲区
      使用固定大小,但正如您所说,如果文件大于此值,我以后可能会遇到问题。Rig现在,我只是从基础开始,通过使程序更复杂来学习。因此,我接下来的步骤之一是分解给出的任何文件,然后发送它。非常感谢!@Celada我还记下了您关于检查
      fread
      的返回值所说的话。这也会纠正。非常好,但是“返回值”“可以是小于文件完整大小的任何值”仅在发生EOF时才为真。如果发生错误,返回值将为-1,并且将伴随
      errno
      @Celada谢谢。这些愚蠢的错误:(.我在客户端传递了
      文件大小
      值,然后将从
      recvfrom
      调用返回的值用于我的
      写入
      。现在一切正常。目前,我正在为我的
      文件缓冲区
      使用固定大小,但正如您所说,如果文件大于此值,我以后可能会遇到问题。Rig现在我只是从基础开始,通过使程序更复杂来学习。因此,我接下来的步骤之一是分解给出的任何文件,然后发送。非常感谢!@Celada我还记下了您关于检查
      fread
      的返回值所说的话。我也会纠正这一点。
      //Receiving file from client
              char file_buffer[BUFSIZE];
              if(recvfrom(sock, file_buffer, BUFSIZE, 0, (struct sockaddr *) &client_addr, &client_addr_size)<0)
              {
                  printf("Error receiving file.");
                  exit(1);
              }
      
              char new_file_name[] = "copied_";
              strcat(new_file_name,file_name);
              FILE *fp;
              fp = fopen(new_file_name,"w+");
              if(fwrite(file_buffer, 1, sizeof(file_buffer), fp)<0)
              {
                  printf("Error writing file! \n");
                  exit(1);
              }