C++手写HTTP网站服务器
时间: 2023-07-11 18:09:13 浏览: 137
写一个 C++ 手写 HTTP 网站服务器,可以分为以下几个步骤:
1. 创建一个 socket,绑定 IP 和端口,监听客户端连接请求。
2. 当有客户端连接进来时,接收客户端的请求数据,解析 HTTP 请求头,获取请求的资源路径。
3. 根据请求的资源路径,读取对应的文件内容,并构造 HTTP 响应报文,将文件内容放入响应报文的正文部分,并设置响应头信息。
4. 将构造好的响应报文发送给客户端。
5. 关闭与客户端的连接。
下面是一个简单的示例代码:
```c++
#include <iostream>
#include <cstring>
#include <string>
#include <fstream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
using namespace std;
const int BUFFER_SIZE = 1024;
int main(int argc, char *argv[]) {
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd < 0) {
cerr << "socket create failed!" << endl;
exit(-1);
}
struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
cerr << "bind failed!" << endl;
exit(-1);
}
if (listen(server_fd, 10) < 0) {
cerr << "listen failed!" << endl;
exit(-1);
}
while (true) {
struct sockaddr_in client_addr;
socklen_t client_addr_len = sizeof(client_addr);
int client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_addr_len);
if (client_fd < 0) {
cerr << "accept failed!" << endl;
continue;
}
char buffer[BUFFER_SIZE];
memset(buffer, 0, BUFFER_SIZE);
int count = recv(client_fd, buffer, BUFFER_SIZE, 0);
if (count < 0) {
cerr << "recv failed!" << endl;
close(client_fd);
continue;
}
string request(buffer);
int pos1 = request.find(' ');
int pos2 = request.find(' ', pos1 + 1);
string path = request.substr(pos1 + 1, pos2 - pos1 - 1);
if (path == "/") {
path = "/index.html";
}
string file_path = "./www" + path;
ifstream infile(file_path.c_str());
if (!infile.good()) {
string response = "HTTP/1.1 404 Not Found\r\n\r\n";
send(client_fd, response.c_str(), response.length(), 0);
} else {
string response = "HTTP/1.1 200 OK\r\n\r\n";
send(client_fd, response.c_str(), response.length(), 0);
char buffer[BUFFER_SIZE];
memset(buffer, 0, BUFFER_SIZE);
while (infile.good()) {
infile.read(buffer, BUFFER_SIZE);
send(client_fd, buffer, infile.gcount(), 0);
}
}
close(client_fd);
}
close(server_fd);
return 0;
}
```
这是一个简单的静态网页服务器,它将网站文件放在 "./www" 目录下,监听端口为 8080。当有客户端连接进来时,会读取客户端请求的资源路径,如果是根路径 "/",则默认返回 "index.html" 文件,否则返回请求的文件。如果请求的文件不存在,则返回 404 错误。
阅读全文