C++实现HTTP服务

一个多平台的系统基本架构(如下图),数据库部分我们以后可以使用HDFS和MapReduce进行分布式存储,之前大致介绍了js和c++交互的几种方式对比,考虑到拓展性和访问效率,还是优先使用HTTP协议。
在这里插入图片描述

由于C++并没有封装HTTP的相关接口,所以我们需要自己封装,HTTP属于应用层的协议,其依赖的传输层协议还是TCP(如下图),所以我们可以通过socket的监听来完成http的监听。
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <iostream>

#define port 8080 //监听端口,可以在范围内自由设定
#define message "HTTP server is ready!"//返回给客户机的信息

using namespace std;

int main()
{
	//1.创建一个socket套接字
	int local_fd = socket(AF_INET, SOCK_STREAM, 0);
	if (local_fd == -1)
	{
		cout << "socket error!" << endl;
		exit(-1);
	}
	cout << "socket ready!" << endl;

	//2.sockaddr_in结构体:可以存储一套网络地址(包括IP与端口),此处存储本机IP地址与本地的一个端口
	struct sockaddr_in local_addr;
	local_addr.sin_family = AF_INET;
	local_addr.sin_port = htons(port);  //绑定端口
	local_addr.sin_addr.s_addr = htonl(INADDR_ANY);//绑定本机IP地址

	//3.bind(): 将一个网络地址与一个套接字绑定,此处将本地地址绑定到一个套接字上
	int res = bind(local_fd, (struct sockaddr *)&local_addr, sizeof(local_addr));
	if (res == -1)
	{
		cout << "bind error!" << endl;
		exit(-1);
	}
	cout << "bind ready!" << endl;

	//4.listen()函数:监听试图连接本机的客户端
	//参数二:监听的进程数
	listen(local_fd, 10);
	cout << "等待来自客户端的连接...." << endl;

	while (true)//循环接收客户端的请求
	{
		//5.创建一个sockaddr_in结构体,用来存储客户机的地址
		struct sockaddr_in client_addr;
		socklen_t len = sizeof(client_addr);
		//6.accept()函数:阻塞运行,直到收到某一客户机的连接请求,并返回客户机的描述符
		int client_fd = accept(local_fd, (struct sockaddr *)&client_addr, &len);
		if (client_fd == -1)
		{
			cout << "accept错误\n"
				 << endl;
			exit(-1);
		}

		//7.输出客户机的信息
		char *ip = inet_ntoa(client_addr.sin_addr);
		cout << "客户机: " << ip << " 连接到本服务器成功!" << endl;

		//8.输出客户机请求的信息
		char buff[1024] = {0};
		int size = read(client_fd, buff, sizeof(buff));
		cout << "Request information:\n"
			 << buff << endl;
		cout << size << " bytes" << endl;
		
		//9.使用第6步accept()返回socket描述符,即客户机的描述符,进行通信。
		write(client_fd, message, sizeof(message));//返回message
		
		//sleep(10);

		//10.关闭sockfd
		close(client_fd);
	}
	close(local_fd);
	return 0;
}
$ g++  httpd.cpp -o httpd
$ ./httpd

然后通过网页输入自己的https://服务器IP:端口号就可以访问了。
在这里插入图片描述

后续只需使用js或java发送get请求,再通过nginx的proxy代理,即可将客户端的请求数据发送到C++的业务服务器进行相关处理。

  • 15
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
HTTP(Hypertext Transfer Protocol)是用于在万维网上传输数据的应用层协议,C++中通常不会直接编写HTTP协议的完整代码,因为HTTP库通常由像cURL、Poco、Boost.Asio这样的第三方库提供。这些库提供了方便的接口来处理HTTP请求和响应。 以下是一个使用C++和Boost.Asio库简单发送HTTP GET请求的例子: ```cpp #include <boost/asio.hpp> #include <string> std::string host = "www.example.com"; std::string path = "/"; void make_http_request(const std::string& host, const std::string& path) { try { boost::asio::io_context io; boost::asio::ip::tcp::resolver resolver(io); boost::asio::ip::tcp::resolver::query query(host, "http"); boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); boost::asio::ip::tcp::socket socket(io); boost::asio::connect(socket, endpoint_iterator); boost::asio::write(socket, boost::asio::buffer("GET " + path + " HTTP/1.1\r\n" "Host: " + host + "\r\n" "Connection: close\r\n" "\r\n")); boost::array<char, 1024> receive_buffer; boost::asio::read(socket, boost::asio::buffer(receive_buffer)); // 打印接收到的数据 for (const auto& c : receive_buffer) { std::cout << static_cast<char>(c); } socket.close(); } catch (std::exception& e) { std::cerr << "Error: " << e.what() << std::endl; } } int main() { make_http_request(host, path); return 0; } ``` 请注意,这只是一个基本示例,实际使用时可能需要处理更复杂的错误情况,并且通常会使用更高级的库来解析HTTP响应。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值