首页 > 其他分享 >Day3_beast实现http server

Day3_beast实现http server

时间:2024-05-27 22:22:53浏览次数:20  
标签:std http socket Day3 beast Start HttpConnection 连接 指针

一、绑定和监听连接

  1. 在1CServer.h中声明acceptor, 以及用于事件循环的上下文iocontext,和构造函数
class CServer:public std::enable_shared_from_this<CServer>
{
public:
    CServer(boost::asio::io_context& ioc, unsigned short& port);	//构造函数
    void Start();		//启动服务器
private:
    tcp::acceptor  _acceptor;	//监听器
    net::io_context& _ioc;		//上下文服务
    boost::asio::ip::tcp::socket   _socket;	//socket
};

实现Star()函数

//功能:启动服务器
//实现一个监听函数,对方来连接,我们就要接收这个连接
void CServer::Start()
{
	//伪闭包技术
	//我们在防止一些回调函数没有回调过来的时候,怕这个类被析构掉,所以我们先把这个类对象这个this指针生成为一个智能指针
	//这个智能跟其他管理这个this指针的智能指针,它们是共享引用计数的,所以采用shared_from_this的方式,而不是直接构造一个智能指针
	//如果直接构造智能指针,会出现两个智能指针管理同一个内存区域,就会出现问题
	auto self = shared_from_this();

	//_acceptor目的:就是接收新连接,接收新连接之后交给HttpConnection去管理
	//不管成功还是失败,我们会传这样一个lambda表达式,通过这样一个错误码去绑定。如果成功,返回空,如果出错则非空
	_acceptor.async_accept(_socket, [self](beast::error_code ec) {
		//因为C++这个网络,尤其是boost::asio,它有的时候,网络出现错误,他不会给你走正常的,可能给你按异常处理
		try {
			if (ec)		//如果出错,就放弃socket连接,继续监听其他连接
			{
				self->Start();
				return;
			}
			//如果没错误,需要自己去定义一个连接管理类,启动这个连接管理类去处理socket上的所有的读事件/写事件
			//创建新连接,并且创建HttpConnection类管理这个类
			//Start函数内创建HttpConnection类型智能指针,将_socket内部数据转移给HttpConnection管理,
			//_socket继续用来接受写的链接。
			std::make_shared<HttpConnection>(std::move(self->_socket))->Start();

			//继续监听
			self->Start();
		}
		catch (std::exception& exp)	//捕获错误
		{
			std::cout << "exception is " << exp.what() << std::endl;
			self->Start();
		}
	});
}
  1. 创建新连接,并且创建HttpConnection类管理这个类
    Start函数内创建HttpConnection类型智能指针,将_socket内部数据转移给HttpConnection管理,
    _socket继续用来接受写的链接。
std::make_shared<HttpConnection>(std::move(self->_socket))->Start();

标签:std,http,socket,Day3,beast,Start,HttpConnection,连接,指针
From: https://www.cnblogs.com/H43724334/p/18216612

相关文章

  • Http 代理工具 实战 支持网页与QQ代理
    前言:有些公司不让员工上Q或封掉某些网站,这时候,干着急没办法,只能鄱墙。如果上网搜代理IP,很少能用,用HTTP-Tunnel Client代理软件,免费的也是经常性的掉线。正好手头上有N台服务器,如果直接在上面装个CCProxy,也显的太明显了。于是自己写个代理软件放上去,一来包装一下好伪装,二来又有......
  • Nginx R31 doc-13-Limiting Access to Proxied HTTP Resources 访问限流
    前言大家好,我是老马。很高兴遇到你。我们为java开发者实现了java版本的nginxhttps://github.com/houbb/nginx4j如果你想知道servlet如何处理的,可以参考我的另一个项目:手写从零实现简易版tomcatminicat手写nginx系列如果你对netty不是很熟悉,可以读一下从......
  • nginx开启ssl并把http重定向到https
    前言Nginx是一个非常强大和流行的高性能Web服务器。本文讲解Nginx如何整合https并将http重定向到https。Nginx的特点(1)热启动:例如当修改配置文件后,不需要停止与启动就可以让配置生效,命令:nginx-sreload(2)高并发连接:顶住10万以上连接是没有问题的。(3)低内存消耗:在高性能的同时......
  • 通过adb设置雷电模拟器的HTTP代理
    连接雷电模拟器.\adbconnect127.0.0.1:5555获取路由地址,一般为172.16.1.2(这里我的笔记本显示是172.16.1.1,但是未设置成功,那就用172.16.1.2).\adb-s127.0.0.1:5555shell'iproutelisttableallscopeglobal|cut-F3'.\adb-s127.0.0.1:5555shellsettingsputgl......
  • 如何使用ADB shell设置Android设备的全局HTTP代理
    打开ADB调试这里使用蓝叠模拟器进行测试下载adbhttps://dl.google.com/android/repository/platform-tools-latest-windows.zip解压好,放哪都行在platform-tools目录下,右击空白处,选择“在终端中打开”开始操作建立连接.\adbconnectlocalhost:5555启动shell会话......
  • 接口报错.w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework
    1、报文:.w.s.m.s.DefaultHandlerExceptionResolver:Resolved[org.springframework.http.converter.HttpMessageNotReadableException:JSONparseerror:Unexpectedcharacter('''(code39)):wasexpectingdouble-quotetostartfieldname;nestedex......
  • Edge浏览器http自动跳转https
        今天上午遇到了一个很纳闷的事情,就是说原本是http网址,复制到Edge浏览器里它会自动修改为https网址,这样http网址就无法加载进去(起初我think是网址本身的问题,换了多个浏览器都是以失败告终,后面我发现用手机浏览器登陆这个http网址是没有问题的,经过仔细勘察,发现问题所......
  • Day3
    今天是day3,今天的内容如下:第一题为移除链表元素,简而言之为,给定一个链表,要求删除所有值为val的节点并最终把头结点输出。funcremoveelements(head*ListNode,valint)*ListNode{forhead!=nil&&head.Val==val{head=head.next}cur:=headfor......
  • springmvc 前端向后端发送http请求报错“HTTP状态 405 - 方法不允许”
    如图我使用前端向后端发送文件时报错,405方法不允许,于是我就检查了前后端的method方法设置是否一致?  检查后发现明明前后端请求方式一致,都是post遵循文件上传的方式。这个问题令我十分苦恼,最后发现原来是前端提交form表单时设置的选项之间存在逗号,原则是每一项之间都不应......
  • .NET集成DeveloperSharp实现http网络请求&与其它工具的比较
     爆了,爆了,DeveloperSharp系列近期又被制造业ERP、民航飞行App、建筑BIM、电力掌上营业厅、等多家大型采用,站在巨人的肩膀上你能走的更远。 支持.NetCore2.0及以上,支持.NetFramework4.0及以上http请求调用是开发中经常会用到的功能。在内,调用自有项目的WebApi等形式接口时......