【问题标题】:UDP Send File Exact Number of BytesUDP 发送文件的确切字节数
【发布时间】:2013-09-05 03:54:50
【问题描述】:

我正在编写一个玩具客户端/服务器应用程序并通过 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);

【问题讨论】:

    标签: c udp


    【解决方案1】:

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

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

    【讨论】:

    • 你是对的。我怀疑这是问题所在,但我不知道如何获取文件大小。再读一点后,我意识到 fread 返回文件大小(在这种情况下),所以我认为我有它。谢谢!
    猜你喜欢
    • 2016-06-16
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    相关资源
    最近更新 更多