gpt4 book ai didi

c++ - 为什么我用 Boost.ASIO 实现的简单 HTTP 服务器需要 sleep 才能正常工作

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:45:03 28 4
gpt4 key购买 nike

我正在尝试使用 Boost.Asio 编写一个非常简单的 HTTP 服务器。这是代码(几乎与 Boost.Asio 教程中的示例相同)

#include <iostream>
#include <string>
#include <boost/asio.hpp>
#include <thread>
#include <chrono>

using boost::asio::ip::tcp;

int main()
{
try
{
boost::asio::io_service io_service;

tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 12345));

for (;;)
{
tcp::socket socket(io_service);
acceptor.accept(socket);

const char message[] = "HTTP/1.0 200 OK\r\n\r\n<html><body><i>Hello, world</i></body></html>";

boost::system::error_code ignored_error;
boost::asio::write(socket, boost::asio::buffer(message), ignored_error);
}
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}

return 0;
}

当我运行此示例时,我尝试使用地址为 127.0.0.1:12345 的 Chrome,但它显示“此网页不可用”。但是,如果我在调试器中开始并逐步执行,它会正确显示斜体“Hello, world”。事实上,如果我在写操作之后添加一行 std::this_thread::sleep_for(std::chrono::seconds(1)); ,它将正常工作。我究竟做错了什么?有没有办法避免这种丑陋的黑客行为?

我在 Windows 7 上使用 Visual Studio 2013。编译为 64 位代码。

最佳答案

我认为问题是 HTTP 问题,而不是网络问题。

该消息缺少 Content-Length header ,因此您的 HTTP/1.1 客户端 (Chrome) 可能正在等待您的服务器关闭连接以标记结束消息正文,请参阅:rfc2616第 4.4 节。尝试将消息更改为:

  "HTTP/1.0 200 OK\r\nContent-Length: 45\r\n\r\n<html><body><i>Hello, world</i></body></html>";

希望我的消息正文的 Content-Length 是正确的。 ;)

关于c++ - 为什么我用 Boost.ASIO 实现的简单 HTTP 服务器需要 sleep 才能正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23215577/

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