
http服务器项目
C++多并发服务器
Colin_666
这个作者很懒,什么都没留下…
展开
-
定时器模块
使用定时器的原因:HTTP/1.1 默认是长连接的过多的长连接会占用服务器资源,所以服务器会用一些策略有选择地关闭长连接,比如通过定时器设置最大长连接时间管理非活动连接,超时释放资源...原创 2020-07-12 15:34:24 · 401 阅读 · 0 评论 -
项目中用到的线程同步机制
互斥锁APIpthread_mutex_t m_mutex;pthread_mutex_init(&m_mutex,NULL);pthread_mutex_lock(&m_mutex);pthread_mutex_unlock(&m_mutex);pthread_mutex_destroy(&m_mutex);可能发生死锁的情况:同一个线程中对已经加锁的互斥锁再次加锁,pthread_mutex_lock()会一直阻塞下去,发生死锁现在有两个线程A、B,原创 2020-07-09 18:15:52 · 268 阅读 · 0 评论 -
Linux IO复用
selectselect(int nfds , fd_set* readfds , fd_set* writefds , fd_set* exceptfds , struct timeval* timeout );nfds 要监听的文件描述符的总数,通常被设置为select监听的文件描述符最大值加1;readfds、writefds、exceptfds 表示可读、可写、异常事件的集合,其实就是数组,数组当中的每一位(bit)表示一个文件描述符,调用select需要传入读、写、异常事件的集合,如果文件描原创 2020-07-06 21:35:33 · 166 阅读 · 0 评论 -
http服务器之日志系统
一、单例模式日志系统采用了单例模式,单例模式保证一个类只有一个实例,同时提供了一个可供全局访问该实例的静态方法,该实例可以被程序的所有模块共享。实现方法:通过一个类静态成员返回局部静态实例,可供全局访问。同时私有化类的构造函数、析构函数。防止外界创建单例类的对象。二、日志系统的初始化主要包括判断同步日志/异步日志、初始化日志类的成员变量(日志的缓冲区申请内存、日志最大行数、日志的日期等)、创建日志文件(日志文件名是根据日期命名的)三、日志的写入1、首先传入的参数确定日志的具体类型目前定义有4种原创 2020-06-30 22:51:55 · 1229 阅读 · 0 评论 -
http服务器之线程池
线程池使用一个工作队列解除主线程和工作线程的耦合关系:主线程向工作队列中添加任务,工作线程通过竞争来取得任务并执行。就是生产者消费者模型。首先创建一个线程数组,并初始化一定数量的线程,创建完成之后将线程设为脱离线程。线程函数必须是静态成员函数,因为pthread_create()的第三个参数中的函数指针指向的线程函数的形参必须是void*类型,而类的动态成员函数作为函数参数时,this指针会作为默认参数传进成员函数中,如果线程函数是类的成员函数则与形参类型不匹配,会编译不通过。同时为了静态函数能操作类原创 2020-06-28 17:21:36 · 1130 阅读 · 0 评论 -
服务器项目问题总结
网络协议GET 、POST方法的区别1、GET参数放在url中,POST参数放在消息体中,GET参数直接暴露在url中,所以GET相比POST不安全,不能传递敏感信息2、GET 可以被缓存,POST不能被缓存3、GET可以被存为书签,POST不能被存为书签4、GET的url最大有2048个字符,POST无长度限制5、后退刷新按钮,GET无害,POST会被重新提交6、GET的数据类型只能是ASCII码,而POST没有限制,可以是二进制...原创 2020-06-22 15:02:33 · 480 阅读 · 0 评论 -
生成http响应并将响应报文发送给浏览器
在解析完客户端的请求报文之后,接下来就是根据解析的结果生成响应报文并发送一个应答。一、找到请求的资源文件根据解析请求报文得到的url 判断请求的资源文件是否存在并且用户是否具有可读的权限。若文件存在且可读,则调用mmap()将资源文件映射到内存中,m_file_address保存文件在内存中的地址。二、生成响应报文的状态行和头部信息生成响应报文的状态行和头部信息 可以通过具有一个可变参数的函数来完成。bool add_response(const char* format,...){ if(原创 2020-06-14 22:08:53 · 1207 阅读 · 0 评论 -
有限状态机解析HTTP请求报文
HTTP报文的解析过程比较繁琐,基于状态机的思想设计程序会一定程度降低复杂性。一、从状态机从状态机状态转移图从状态机三种状态LINE_OK ,完整读取一行LINE_OPEN,读取的行不完整LINE_BAD,读取的报文有误从状态机每次从缓冲区读取一行信息,直至读取到 \r\n 表示读取到一行,同时将 \r\n 替换为 \0\0 便于主状态机读取该行,然后再将行起始标志定位到下一行的起始位置。二、主状态机主状态机有三种状态CHECK_STATE_REQUESTLINE,解析请求行C原创 2020-06-14 17:59:51 · 2844 阅读 · 1 评论