无法使用UDP通过二进制文件发送pdf

Unable to send pdf through binary with UDP

本文关键字:二进制文件 pdf UDP      更新时间:2023-10-16

通过读取二进制文件,我在将pdf文件从客户端发送到服务器时遇到了一些问题。我使用UDP传输,当我从客户端向服务器发送文本文件时,我会完全收到文件,没有任何错误,但当我发送PDF时,打开文件时会出错。以下是我为发送者和接收者准备的:

发件人:

file = fopen(file_name_char, "rb"); //read in binary here
int size_count = (file_size / (BUFFER_SIZE - 2)) + 1; //amount of times to loop
            for (int i = 0; i < size_count; i++)
            {
                memset(szbuffer, 0, BUFFER_SIZE);
                fread(szbuffer, sizeof(char), BUFFER_SIZE - 2, file); //Read for the buffersize -2 (reserve a spot for bit and )
                strcpy(szbuffer, concat(current_bit, szbuffer));
                send_with_select(s, szbuffer, (struct sockaddr*)&sa1, (struct sockaddr*)&sa1, sa1_length, current_bit, "file contents", 0); //send file contents
                file_size = file_size - BUFFER_SIZE + 2; //decrease size
                client_bit = change_bit(client_bit);
                *current_bit = bit_string(client_bit);
                //change bit
            }
            fclose(file);

对于我的UDP传输,我正在为每个缓冲区准备一个序列号,以模拟Stop-N Wait协议

接收器:

int size_count = (file_size / (BUFFER_SIZE - 2)) + 1; //amount of times to loop
            for (int i = 0; i < size_count; i++)
            {
                file = fopen(file_name, "ab"); 
                //open file for writing
                memset(szbuffer, 0, BUFFER_SIZE);
                receive_packet_transfer(s, szbuffer, (struct sockaddr*)&sa_in, (struct sockaddr*)&sa_in, sa_length, current_bit, content, "file contents", client_bit); //receive file contents
                client_bit = change_bit(client_bit);
                *current_bit = bit_string(client_bit);
                //change bit
                if (file_size <= BUFFER_SIZE)
                    fwrite(content, sizeof(char), file_size, file);
                else
                    fwrite(content, sizeof(char), BUFFER_SIZE - 2, file); //write into file
                file_size = file_size - BUFFER_SIZE + 2; //decrease size
                fclose(file);
            }

我已经使用sendto()recvfrom()方法实现了send_with_select()和receive_packet_transfer()。它们基本上做相同的事情,但等待ACK或超时(使用select)。

strcpy(szbuffer,concat(current_bit,szbuffer));

strcpystrlen等字符串操作函数只能处理文本数据,而文本数据本身不能包含,因为它们认为是字符串的末尾。但是PDF是二进制的,因此可以包含。因此CCD_ 6将仅将数据拷贝到第一CCD_。

除此之外,使用UDP传输文件是个坏主意,除非你确保你可以处理丢失的数据包、重复的数据包和数据包重新排序。最好使用已经关心这一切的TCP。