【问题标题】:Sending Files With Sockets使用套接字发送文件
【发布时间】:2011-05-16 18:52:57
【问题描述】:

我正在尝试创建一个基本的 HTTP 服务器,以了解有关它如何工作的更多信息。我在向客户端发送二进制文件时遇到了困难。我的代码如下:

char * buffer = (char *)malloc(sizeof(char) * 512);
fseek(content_file, 0, SEEK_SET);
while (!feof(content_file)) {
    size_t read = fread(buffer, sizeof(char), sizeof(buffer), content_file);
    if (read > 0) {
        client->send((const void *)buffer);
    }
}
fclose(content_file);
free(buffer);

现在我知道它可以在读取最后一个块后发送一些不必要的数据,但在尝试修复它之前,我想知道它有什么问题。它适用于文本文件,我正在使用 fgets。但是在切换到 fread 支持二进制文件后,文本文件损坏并变成这样:ThisÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ(“This”是发送数据中唯一正确的部分)

显然我遗漏了一些东西,但你能帮我正确地做到这一点吗?

编辑:

使用buffer_size 值而不是sizeof(buffer) 修复了丢失/损坏的数据问题。

【问题讨论】:

  • 你能告诉我们cleint->send的签名和/或代码吗?具体来说,它如何知道要发送多少字节?
  • 哦,我太傻了,我在客户端使用 strlen->send :-) 谢谢,但我无法将您的评论标记为解决方案,所以我会继续标记 Bo 的。

标签: c++ winapi http sockets winsock


【解决方案1】:

你的问题是 sizeof(buffer) 给你指针的大小,而不是它指向的大小。

添加buffer_size 并将其用于mallocfreed

【讨论】:

  • 您可以使用以下代码获取文件大小:fseek (fp, 0, SEEK_END); ulFileSize = ftell (fp); fseek (fp, 0, SEEK_SET);
  • 谢谢,CariElf。这就是我正在使用的。
猜你喜欢
  • 2012-11-13
  • 1970-01-01
  • 2011-09-13
  • 2017-03-15
  • 1970-01-01
  • 2011-08-01
  • 2011-02-24
相关资源
最近更新 更多