为什么我的 HTTP 服务器只收到第一个 GET 请求

时间:2021-03-24 13:29:51

标签: c++ http get httpserver

我想使用本机 C/C++ 套接字编写自己的服务器,这些套接字将响应浏览器的 HTTP GET 请求。我编写了服务器从客户端接收某些东西所需的所有代码,并且它可以工作。好吧,对于第一个 GET 请求...

当我打开浏览器并转到 localhost 时,浏览器成功连接到服务器,并向其发送这样的请求。
获取/HTTP/1.1
然后,我的服务器使用最简单的标准 html 页面发送响应,其中包含文本和指向 style.css 文件的链接。之后,浏览器发送一个 style.css 请求
获取/style.css HTTP/1.1
但是它已经没有到达服务器,它只是消失在某个地方。 Chrome 中的 DevTools 告诉我请求已发送,它等待响应,但服务器完全没有收到任何请求(JS 文件、favicon.ico 等),我自己无法真正解决这个问题。我想知道这是否与我的代码有关。
这是代码的最小复制。

    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
    {
        std::cout << "WSAStartup failed. Aborting.\n";
        return 1;
    }
    std::cout << "Initialized.\n";

    int client;
    int server;
    client = socket(AF_INET, SOCK_STREAM, 0);

    struct sockaddr_in server_addr;
    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(15742);

    bind(client, reinterpret_cast<struct sockaddr*>(&server_addr), sizeof(server_addr));
    std::cout << "Binding done\n";

    listen(client, 1);

    int size = sizeof(server_addr);
    std::cout << "Waiting to accept a client\n";
    server = accept(client, reinterpret_cast<struct sockaddr*>(&server_addr), &size);
    std::string HTTPresponseBase;
    std::string responsehtml;
    std::string responsecss;
    constexpr size_t buff_size = 2048;
    char buffer[buff_size] = { 0 };

    HTTPresponseBase = R"response(HTTP/1.1 200 OK\n\n)response";

    std::string html = R"html(<html>
  <head>
    <title>An Example Page</title>
    <link rel="stylesheet" href="style.css">
  </head>
  <body>
    <p class="header">Hello World, this is a very simple HTML document.</p>
  </body>
</html>)html";

    std::string css = R"css(
.header{
    color: red;
}
)css";
    responsehtml = HTTPresponseBase;
    responsehtml += html;

    responsecss = HTTPresponseBase;
    responsecss += css;

    std::string message;
    if (server > 0)
    {
        std::cout << "Connected to web-browser\n";

        while (true) {
            recv(server, buffer, buff_size, 0);
            if (buffer[0] == 0)
                continue;
            std::cout << "Client:\n" << buffer << '\n';
            if(strstr(buffer, "GET / "))
                send(server, responsehtml.c_str(), responsehtml.size() + 1, 0);
            else if (strstr(buffer, "GET /style.css"))
                send(server, responsecss.c_str(), responsecss.size() + 1, 0);
            std::cout << "Response sent\n";

            memset(buffer, 0, buff_size);
        }
    }

在此先感谢您!

0 个答案:

没有答案