从零编写c++之http服务器(3)-http服务

本文介绍如何在C++中构建一个基于epoll和线程池的HTTP服务器。首先,讨论了HTTP协议的重要性,然后逐步解释如何从基础套接字扩展到HTTP套接字,避免使用继承以减少耦合。在HttpServer中,启动CStreamServer并设置为非阻塞模式,注册到事件中心以监听连接建立。当接收到新的连接时,使用CHttpRequest解析请求,并根据HTTP方法(如GET)处理请求。响应构造完成后,通过序列化发送回客户端,采用短链接模式。最后,提供了编译和运行服务器的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        http全称超文本传输协议,可调试性高,扩展性也强。上两个篇章我们已经拥有了epoll事件驱动框架和线程池处理网络事件,接下来我们要先写一个基础网络套接字,然后在此基础上扩展出http的套接字。献上类图如下

完整源码见<https://github.com/kwansoner/panda.git>

                                            

        可以看到我们有一个最顶层的基类ISocket,拥有一个方法fd返回描述符,增加这个接口时由于事件中心注册到epoll里需要int型的描述符。接下来在ISocket基础上派生出IServer与IClient两个基类。实例化出两个TCP类型的套接字类CStreamServer与CStreamClient。然后我们就可以组合的方式扩展出两个http套接字类,不用继承的原因是继承增加耦合,也没有必要用继承。由于HttpStream与HttpServer需要收听事件中心的事件回调,因此需要继承IEventHandle。

class ISocket
{
	public:
		virtual ~ISocket(){};
		
		// desc: 获取套接字描述符
		// param: void
		// return: 套接字描述符
		virtual int fd() = 0;
};

class IClient: public ISocket
{
	public:
		virtual ~IClient(){};

		// desc: 打开套接字
		// param: void
		// return: 0/成功 -1/失败
		virtual int start() = 0;

		// desc: 关闭套接字
		// param: void
		// return: 0/成功 -1/失败
		virtual int close() = 0;

		// desc: 设置套接字为非阻塞
		// param: block/是否非阻塞
		// return: 0/成功 -1/失败
		virtual int set_nonblock(bool nonblock) = 0;

		// desc: 连接到server
		// param: addr/server地址 port/端口
		// return: 0/成功 -1/失败
		virtual int connect(const std::string
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值