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