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