我正在编写玩具客户端/服务器应用程序并通过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);
答案 0 :(得分:0)
根据sendto命令,UDP将发送与发送长度中指定的数据量相同的数据;第三个参数是发送长度:http://linux.die.net/man/2/sendto。示例是指定sizeof(缓冲区),因为发送长度和sizeof(缓冲区)是5000.因此,UDP从缓冲区(实际上是整个缓冲区)发送5000个字节。如果我们想要发送文件中存在的确切字节数,那么我们应该读取文件中的字节数,并将其作为发送长度传递。
numbytes = sendto(sockfd, buffer, sizeof(buffer), 0,