【问题标题】:Sending large files over UDP通过 UDP 发送大文件
【发布时间】:2020-01-07 17:03:33
【问题描述】:

我正在尝试创建允许客户端将文件上传到服务器的应用程序,现在我使用 UDP 套接字。

我通过 UDP 发送数据,它适用于小文件,当我尝试发送 1 MB 时它不会发送完整数据。

我听说 UDP 只能处理大约 64kB 的数据包,是真的吗?我能以某种方式处理它并解决我的问题吗?

我的文件发送代码:

        sendto(fdsocket, sizeBuff, sizeof(sizeBuff), 0, (struct sockaddr*)&serverAddress, addrlen); // send file size
            while(1) {
                //Read file in chunks of 1024 bytes
                int nread = fread(buff, 1, BUFF_SIZE, filefp);

                printf("Bytes read %d \n", nread);


                // If read was success, send data

                if(nread > 0){
                    printf("Sending file ...\n");

                    int n = sendto(fdsocket, buff, strlen(buff), 0, (struct sockaddr *) &serverAddress, addrlen);

还有我接收文件的代码:

        recvfrom(fdsocket, sizeBuff, sizeof(sizeBuff), 0, (struct sockaddr *)&serverAddress, &addrlen); // recv file size
        filesize = sizeBuff[0];
        printf("Filesize: %lu", filesize);

        //recvfrom(fdsocket, buff, BUFF_SIZE, 0, (struct sockaddr *)&serverAddress, &addrlen);

        if(sizeBuff[0] > 0){
            while(sumBytes<filesize){
                /* Receive data in chunks of 1024 bytes */
                bytesReceived = recvfrom(fdsocket, buff, sizeof(buff), 0, (struct sockaddr*)&serverAddress, &addrlen);
                if(bytesReceived < 0) {
                    printf("Recvfrom: Error in receiving the file\n");
                    exit(1);
                } else {
                    sumBytes = sumBytes + bytesReceived;
                    printf("Bytes received: %d\n", sumBytes);
                }
                if(fwrite(buff, 1, bytesReceived, fp)<0){
                    printf("ERROR writing file");
                    exit(1);
                }

我希望它可以处理大文件,例如 100MB,还允许我发送 jpg、xls 等。

我该怎么做?切换到 TCP 会解决我的问题吗?

【问题讨论】:

  • 已经有一个标准协议:TFTP
  • "现在我使用 UDP 套接字" - 你为什么选择 UDP 而不是 TCP?
  • 如果您的目标只是传输文件(而不是学习如何使用 UDP 传输文件),那么使用 TCP 将比使用 UDP 少得多。

标签: c sockets tcp udp


【解决方案1】:

UDP 是一个不可靠的协议。如果数据包丢失,您需要一种方法让接收方通知发送方,以便它可以重新传输数据包。接收方还需要允许乱序接收数据包。

使用 TCP 将为您解决这个问题,因为它具有内置的可靠性,并且可以保证数据按顺序到达。

为 UDP 添加这种可靠性并非易事,但可以做到。无耻插件:UFTP 做到这一点并支持多播。

【讨论】:

    【解决方案2】:

    我听说 UDP 只能处理大约 64kB 的数据包,是真的吗?

    是的。因此,您必须将较大的文件分成较小的数据包并单独发送。并且知道 UDP 是不可靠的——根本不能保证数据包的传递,并且不能保证数据包按照发送的顺序到达——所以你必须在传输协议中增加可靠性——为收到的数据包发回 ACK,在每个数据包中使用序列号等,以便接收方知道哪些数据包按什么顺序发送,发送方可以知道接收方丢失了哪些数据包,以便重新发送。

    切换到 TCP 会解决我的问题吗?

    是的,因为它内置了交付和完整性保证。不过,UDP 也可以工作(Trivial FTP 等协议就是证明)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 2018-10-19
      • 2018-11-09
      • 2014-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多