通过UDP发送大文件

时间:2019-09-04 19:12:57

标签: c sockets tcp udp

我正在尝试创建允许客户端将文件上传到服务器的应用程序,现在暂时使用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是否可以解决我的问题?

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

  

我已经读过UDP只能处理大约64kB数据包,是真的吗?

是的。因此,您必须将较大的文件分解为较小的数据包,然后分别发送。并且要知道UDP是不可靠的-根本无法保证数据包的传送,也不能保证数据包的发送顺序是相同的-因此,您必须在传输协议中增加可靠性-为收到的数据包发回ACK,在每个数据包等中使用序列号,以便接收方知道哪些数据包按什么顺序排列,发送方可以知道接收方丢失了哪些数据包,因此可以重新发送。

  

切换到TCP是否可以解决我的问题?

是的,因为它具有内置的传递和完整性保证。尽管,UDP 也可以工作Trivial FTP这样的协议就是证明)。