C UDP发送文件的确切字节数

C UDP发送文件的确切字节数,c,udp,C,Udp,我正在编写一个玩具客户端/服务器应用程序,并通过UDP流发送数据。当我发送诸如“测试”之类的小消息时,一切都很顺利。但当我去传输文件时,我似乎传输了太多的数据 我正在传输的文件大小略小于4k(至少根据ls命令)。但是当我的sendto操作完成时,我的确认消息显示我已经发送了5000字节(这是我的缓冲区的最大大小) 如果不需要的话,我宁愿不中断sendto,因为UDP可能会导致消息传输混乱。有人知道我做错了什么吗?我认为这与我使用的sizeof(buffer)有关,但我不知道如何准确地传输我想要的

我正在编写一个玩具客户端/服务器应用程序,并通过UDP流发送数据。当我发送诸如“测试”之类的小消息时,一切都很顺利。但当我去传输文件时,我似乎传输了太多的数据

我正在传输的文件大小略小于4k(至少根据ls命令)。但是当我的sendto操作完成时,我的确认消息显示我已经发送了5000字节(这是我的缓冲区的最大大小)

如果不需要的话,我宁愿不中断sendto,因为UDP可能会导致消息传输混乱。有人知道我做错了什么吗?我认为这与我使用的
sizeof(buffer)
有关,但我不知道如何准确地传输我想要的字节数。谢谢大家!

下面是代码的相关部分。如果您需要更多信息,请告诉我:

char buffer[5000];
char path[] = "myfile";

FILE* fp;
if ((fp = fopen(path, "rb")) == NULL) {
    printf(stdout, "Error opening the file: %s\n", strerror(errno));
    exit(1);
}

memset(&buffer[0], 0, sizeof(buffer));
do {
    fread(buffer, 1, MAXBUFSIZE, fp);
} while (!feof(fp));

if ( (numbytes = sendto(sockfd, buffer, sizeof(buffer), 0,
        (struct sockaddr *)&server_addr, sizeof(server_addr))) < 0)
{
    perror("send error");    
}

fprintf(stderr, "client sent %d bytes to server\n", numbytes);
char缓冲区[5000];
字符路径[]=“myfile”;
文件*fp;
if((fp=fopen(路径,“rb”))==NULL){
printf(stdout,“打开文件时出错:%s\n”,strerror(errno));
出口(1);
}
memset(&buffer[0],0,sizeof(buffer));
做{
fread(buffer,1,MAXBUFSIZE,fp);
}而(!feof(fp));
如果((numbytes=sendto)(sockfd,buffer,sizeof(buffer),0,
(结构sockaddr*)和服务器地址,大小(服务器地址))<0)
{
perror(“发送错误”);
}
fprintf(stderr,“客户端向服务器发送了%d个字节”,numbytes);

根据sendto命令,UDP将发送与发送长度中指定的数据量相同的数据;第三个参数是发送长度:。该示例将sizeof(buffer)指定为发送长度,而sizeof(buffer)为5000。因此,UDP从缓冲区(实际上是整个缓冲区)发送5000字节。如果我们想发送文件中的确切字节数,那么我们应该读取文件中的字节数,并将其作为发送长度传递

numbytes = sendto(sockfd, buffer, sizeof(buffer), 0,

你说得对。我怀疑这就是问题所在,但我不知道如何获得文件大小。读了一会儿之后,我意识到fread返回了文件大小(在本例中),所以我认为我已经得到了它。谢谢