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

问题描述

我想使用本机 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,&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,buff_size);
        }
    }

在此先感谢您!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)