下面是实现简单的HTTP服务器的攻略:
1. 搭建服务器
在C++中,我们可以使用socket进行网络编程。首先创建一个Socket,接着Bind绑定端口号和IP地址,最后调用Listen进行监听客户端的连接请求。
// 创建socket
int server_socket = socket(AF_INET, SOCK_STREAM, 0);
// 绑定端口号和IP地址
sockaddr_in server_address;
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
server_address.sin_port = htons(8080);
bind(server_socket, (sockaddr *)&server_address,sizeof(server_address));
// 监听客户端
listen(server_socket, 10);
2. 接收客户端请求
当客户端发送请求时,我们需要通过Accept获取客户端的Socket,并接收客户端发送的HTTP请求。
// 接受客户端请求
sockaddr_in client_address;
socklen_t client_address_size = sizeof(client_address);
int client_socket = accept(server_socket, (sockaddr *)&client_address, &client_address_size);
// 接收HTTP请求
char buffer[1024] = {};
recv(client_socket, buffer, sizeof(buffer), 0);
3. 解析HTTP请求
将接收到的HTTP请求使用字符串分割方式,将其中的信息进行提取,如获取请求的方法、请求的路径和参数等。
// 解析HTTP请求
std::string request = buffer;
int method_end = request.find(' ');
std::string method = request.substr(0, method_end);
int path_end = request.find(' ', method_end + 1);
std::string path = request.substr(method_end + 1, path_end - method_end - 1);
int query_start = path.find('?');
std::string query_string;
if (query_start != std::string::npos)
{
query_string = path.substr(query_start + 1);
path = path.substr(0, query_start);
}
4. 处理HTTP请求
根据HTTP请求的内容,进行相应的处理。如,处理GET请求,并将请求资源返回给客户端。
if (method == "GET")
{
std::string filename = "www" + path;
std::ifstream t(filename);
std::stringstream buffer2;
buffer2 << t.rdbuf();
std::string content = buffer2.str();
std::string output = "HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=UTF-8\r\n\r\n" + content;
send(client_socket, output.c_str(), strlen(output.c_str()), 0);
}
示例1:在网站根目录下创建一个名为“www”的文件夹,并在其中添加一个index.html文件。这个HTML文件将会被当做我们简单的网站内容。
示例2:在网站根目录下的“www”文件夹中,添加一个名为“test.html”的HTML文件。然后在浏览器中访问“http://localhost:8080/test.html”,这样就会返回http://localhost:8080/test.html文件的内容。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现简单的HTTP服务器 - Python技术站