Linux C++服务器项目——项目实战2、3(项目代码讲解)

牛客 C++高并发服务器开发
参考笔记

1 buffer.cpp

/* 分散读, 保证数据全部读完 */
//正常情况下往buffer里面读,buffer读满了,就会往临时数组buff[65535]里面读
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
举例:
已写入0~3,4个数据,剩余1020个位置,本次写入长度为1021个;
超出长度为本次写入长度1021 - 可写长度1020 = 1 ;
那么就在buff中写入超出的一个数据
在这里插入图片描述

2 有限状态机

逻辑单元内部的一种高效编程方法:有限状态机 (finite state machine)。

有的应用层协议头部包含数据包类型字段,每种类型可以映射为逻辑单元的一种执行状态,服务器可以根据它来编写相应的处理逻辑。如下是一种状态独立的有限状态机:

STATE_MACHINE( Package _pack ){
	PackageType -type = _pack.cetType( ;switch( _type )
	{
		case type_A:
		process_package_A( _pack );break;
		case type_B:
		process_package_B( _pack );break;
	}
}

这是一个简单的有限状态机,只不过该状态机的每个状态都是相互独立的,即状态之间没有相互转移。状态之间的转移是需要状态机内部驱动,如下代码:

STATE_MACHINE()
{
	state cur_state = type_A;while( cur_state != type_c )
	{
		Package _pack = getNewPackage(;switch( cur_state )
		{
			case type_A:
				process_package_state_A( _pack );
				cur_state = type_B;//状态A执行完毕,当前状态更新为B
				break;
			case type_B:
				process_package_state_B( _pack );cur_state = type_c;
				break;
		}
	}
}

该状态机包含三种状态: type_A. type_B和type_C,其中 type_A是状态机的开始状态,type_C是状态机的结束状态。状态机的当前状态记录在cur_State变量中。在一趟循环过程中,状态机先通过getNewPackage方法获得一个新的数据包,然后根据cur_State变量的值判断如何处理该数据包。数据包处理完之后,状态机通过给cur_State变量传递目标状态值来实现状态转移。那么当状态机进入下一趟循环时它将执行新的状态对应的逻辑。

3 EPOLLONESHOT事件

即使可以使用ET模式,一个socket上的某个事件还是可能被触发多次。这在并发程序中就会引起一个问题。比如一个线程在读取完某个socket 上的数据后开始处理这些数据,而在数据的处理过程中该socket上又有新数据可读(EPOLLIN再次被触发),此时另外一个线程被唤醒来读取这些新的数据。于是就出现了两个线程同时操作一个socket的局面。一个socket连接在任一时刻都只被一个线程处理,可以使用epoll的EPOLLONESHOT事件实现。

对于注册了EPOLLONESHOT事件的文件描述符,操作系统最多触发其上注册的一个可读、可写或者异常事件,且只触发一次,除非我们使用epol_ctl函数重置该文件描述符上注册的EPOLLONESHOT事件。这样,自H个斑程在处理某个socket时,其他线程是不可能有机会操作该socket的。但反过来思考,注册了EPOLLONESHOT事件的socket一旦被某个线程处理完毕,该线程就应该立即重置这个socket 上的EPOLLONESHOT事件,以确保这个socket下一次可读时,其EPOLLIN事件能被触发,进而让其他工作线程有机会继续处理这个socket。

4 运行

进入Webserver-master目录make编译

make

开启服务器

./bin/server

5.服务器压力测试

Webbench是Linux上一款知名的、优秀的web性能压力测试工具。它是由Lionbridge公司开发。

  • 测试处在相同硬件上,不同服务的性能以及不同硬件上同一个服务的运行状况。
  • 展示服务器的两项内容:每秒钟响应请求数和每秒钟传输数据量。

基本原理: Webbench首先 fork出多个子进程,每个子进程都循环做web访问测试。子进程把访问的结果通过pipe告诉父进程,父进程做最终的统计结果。

测试示例

webbench -c 1000 -t 30 http://192.168.110.129:10000/index.htm1

参数:
-c	表示客户端数(子进程数)
-t	表示时间

进入Webserver-master目录下的webbench-1.5压力测目录下;
make编译测试文件
在这里插入图片描述

./webbench -c 5000 -t 5 http://192.168.37.128:1316/

因为测试文件就在当前目录下,最后斜杠就行了;
5000个客户端测试5秒,结果如下
在这里插入图片描述

11.GET请求和POST请求的区别

6 源码下载

WebServer-master 牛客C++实战项目 高并发服务器(源码+注释)

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

R-G-B

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值