c++ - 使用套接字发送文件

标签 c++ winapi http sockets winsock

我正在尝试创建一个基本的 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);

现在我知道它可以在读取最后一个 block 后发送一些不必要的数据,但在尝试修复它之前,我想知道它出了什么问题。它对文本文件工作正常,我使用的是 fgets。但是在切换到 fread 以支持二进制文件后,文本文件被损坏并变成了这样的东西:

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

编辑:

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

最佳答案

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

添加一个 buffer_size 并将其用于 mallocfreed

关于c++ - 使用套接字发送文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6021947/

相关文章:

c++ - 使用 SetNamedSecurityInfo 设置 GRANT_ACCESS

c++ - 为什么单向链表的 Next() 操作要用临界区保护?

html - http header 和 html meta 中的字符集有什么区别?

C++ 函数返回当前日期(月份和日期为零)

c++ - 是否可以更改C++程序本身的代码?

c++ - 为使用 boost 的预开发库构建 C++ 包装器时 Unresolved external 问题

c++ - 无法使用 mingw-w64 编译智能指针

winapi - 通过 Win32 API 或 NVidia API 启用/禁用多个显示器?

http - golang `Host` 的 `URL.Host` 和 `http.Request` 有什么区别?

google-app-engine - 谷歌应用引擎 : localhost browser caching?