gpt4 book ai didi

c++ - Boost Asio 示例 HTTP 服务器——采用此示例并将其设为 "production ready"

转载 作者:太空狗 更新时间:2023-10-29 21:21:50 25 4
gpt4 key购买 nike

在寻找干净、简单、现代和跨平台的 HTTP 服务器时,我选择了 Boost.Asio C++11 示例 HTTP 服务器。你可能会找到它 here ,并在 boost 源目录 boost_1_55_0/doc/html/boost_asio/example/cpp11/http/server 中。

我稍微检查了一下代码,它看起来很干净而且文档非常详细,所以它几乎是理想的。我只有几个可能只对性能有影响的小问题,目前这是次要优先事项(主要是稳定性),因为我确实打算在移动和嵌入式平台上使用相同的可移植代码。

这个魔数(Magic Number)512出现在request_handler.cpprequest_handler::handle_request()中:

  // Fill out the reply to be sent to the client.
rep.status = reply::ok;
char buf[512];
while (is.read(buf, sizeof(buf)).gcount() > 0)
rep.content.append(buf, is.gcount());
rep.headers.resize(2);
rep.headers[0].name = "Content-Length";
rep.headers[0].value = std::to_string(rep.content.size());
rep.headers[1].name = "Content-Type";
rep.headers[1].value = mime_types::extension_to_type(extension);

而且在 connection.hppconnection 类有这个成员:

/// Buffer for incoming data.
std::array<char, 8192> buffer_;

我不确定为什么使用这些大小,512 字节和 8K 字节。对我来说似乎很清楚,要提供的本地文件正在被读取并一次转储到响应的 std::string 512 字节中。我确实想知道 4K 还是 8K 是更合适的分块大小。

至于8K的buffer_,它似乎是用来保存通过网络到达的数据的。这对我来说有点难弄清楚,因为我发现自己在 asio 的内部。我主要担心 8K 不够用。虽然单个数据包永远不会超过这个长度(我认为......理论上最大数据包大小为 64K,但我只是不知道为什么必须是 8K。

最佳答案

512 字节的缓冲区用于从文件中读取数据,然后将其添加到构造的主体中。这肯定是一个不必要的复制操作,但这只是一个例子。将文件复制到进程本地内存中并将其作为一条消息发送肯定不是最佳选择。

此代码只是一个示例,在您允许其他人访问您的文件系统之前(即使只是读取访问),您应该真正确保不会以这种方式读取任何 secret 信息。

要处理非常大的文件,您可能希望使用 block 编码并逐 block 读取和发送文件,同时等待磁盘和网络。

对于一个普通的 http 请求,8k 对我来说似乎足够了,如果请求主体以其他方式处理的话。

但请记住,这只是一个示例。如果你想拥有一个旨在满足几乎所有可能目的的 http 服务器,你应该看看其他地方。但是不要指望它的实现会像这个提升示例一样微不足道。

关于c++ - Boost Asio 示例 HTTP 服务器——采用此示例并将其设为 "production ready",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21827136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com