
服务器端编程
文章平均质量分 70
gswen
这个作者很懒,什么都没留下…
展开
-
Tinyhttpd服务器源代码解读
Tinyhttpd服务器是一个轻量级的HTTP服务器。代码简短易读,源代码只有500多行,是一个学习unix服务器编程的极佳入门。它的一个github地址为:Tinyhttpd。 Tinyhttpd服务器只有一个核心的c源码文件:httpd.c. 其中包含12个主要的函数。 分别为 void accept_request(int);//对有效请求的响应函数void bad_r原创 2016-03-31 20:08:09 · 917 阅读 · 0 评论 -
muduo中定时器的管理
Eventloop中维护了一个定时器队列:boost::scoped_ptr<TimerQueue> timerQueue_;在事件循环中的所有定时器事件都会被放入到这个队列中。放置定时器的相关函数主要是是Eventloop中的下列成员函数:TimerId runAt(const Timestamp& time, const TimerCallback& cb); //在时间点time调用cbTi原创 2017-02-25 16:08:25 · 1303 阅读 · 0 评论 -
Nginx源码剖析--HTTP模块配置信息的merge
前言考虑有如下形式的配置文件:http{ .... server { ..... location { ..... } }}根据前面的讲解,Nginx会为每个http块,server块和location块创建一个ngx_http_conf_ctx_t结构体。这个结构体主要是为了管理各个模块的main_conf,srv原创 2017-10-27 15:08:20 · 694 阅读 · 0 评论 -
Nginx源码剖析--server和location的组织
前言我们知道,Nginx的配置文件的http块中一般会存在多个server块,每个server块中也会有多个locations块,而每个location块中也允许有多个location块。前面我们在分析http模块的配置结构体的时候也看到,这些块是通过上一级的ngx_http_core_module模块创建的配置结构体管理的。比如http块中的所有server块都是由ngx_http_core_mo原创 2017-11-04 17:04:37 · 1625 阅读 · 0 评论 -
Nginx源码剖析--HTTP请求的分阶段处理的初始化
前言Nginx作为一个http服务器,核心任务就是处理HTTP请求。在接收到请求时,Nginx框架首先解析http请求,将解析结果放在ngx_http_request中,由于http是在tcp上工作的,因此解析可能会持续一段时间。nginx用状态机完成对HTTP请求的异步解析。整个解析过程都是由Nginx框架代码完成,不需要用户介入。当解析得到完整的http请求后,就开始处理http请求。ng原创 2017-11-16 15:42:57 · 633 阅读 · 0 评论 -
Nginx源码剖析--HTTP请求各阶段的具体作用
前言Nginx将HTTP请求分为11各阶段进行处理。每个阶段包含零到多个handler处理函数。分阶段处理的目的是增加灵活性,方便模块介入。HTTP请求处理主要分为一下11个阶段:typedef enum { NGX_HTTP_POST_READ_PHASE = 0, NGX_HTTP_SERVER_REWRITE_PHASE, //对server对应的uri的转换 NGX_HT原创 2017-11-26 10:37:29 · 744 阅读 · 0 评论 -
Nginx源码剖析--连接池
前言NGINX是一个http服务器。http基于tcp协议,tcp是基于连接的协议。也就是每个http请求都要在某个TCP连接上。在NGINX中,用一个结构体表示连接:struct ngx_connection_s每个连接都用一个ngx_connection_s结构体表示。每次监听socket accept到一个新的连接都会”新建”一个新的ngx_connection_s对应到这个原创 2017-12-15 22:20:14 · 947 阅读 · 0 评论 -
Tars源码分析---内存哈希表的实现
前言基本原理前言在cpp/util中实现了基于内存的哈希表(hashmap.(cpp,h))。该哈希表支持dump到文件,以及从文件load到内存。在实现上,它基于传统的开链哈希,分别为每个哈希桶维护一个block链表,相同哈希值的kv对散列存储到相同的block链表中。链表中每个block存储具体的一个kv数据。由于hashmap使用TC_Mem...原创 2018-06-23 12:37:29 · 1474 阅读 · 0 评论 -
Tars源码分析---TC_EpollServer
前言架构IO_Thread PoolHandler PoolAdapter总结前言这个系列的文章主要分析腾讯的开源RPC框架Tars。Tars除了提供RPC服务之外,还配套了一整套的运营管理平台。它同时支持C++,java等多种编程语言。本系列主要是分析tars的cpp部分实现,涉及的版本是github上最近release的1.40版。主要是在源...原创 2018-06-15 21:07:01 · 1862 阅读 · 1 评论 -
读书笔记-限制服务器最大并发连接数的方法
读书笔记–陈硕老师的《linux多线程服务端编程》为什么要限制并发连接数不希望服务器超载file descriptor是稀缺资源,如果出现file descriptor好紧,问题很严重。如果不限制并发连接数可能会引发的问题 对于reactor模式,listening socket是一种特殊的IO对象。当有新连接到来时,此socket变为可读,epoll_wait会返回这一事件,然后在事件处理原创 2017-03-10 13:52:56 · 3680 阅读 · 0 评论 -
Linux I/O模型
本篇博文主要介绍UNIX中五种I/O模型。主要参考了UNP和这篇博文。UNIX中的I/O模型分为一下五种:阻塞I/O (blocking I/O)非阻塞I/O (nonblocking I/O)I/O复用 (I/O multiplexing)信号I/O (signal driven I/O)异步I/O (the POSIX aio_ functions)对于任意一个I/O读取(input转载 2017-03-06 19:23:59 · 476 阅读 · 0 评论 -
将任务加入到Eventloopthread
根据我们分析新线程建立以后,会执行eventloop中的loop函数,而且loop主体是一个while循环,所以在不退出的情况下,新线程将会一直执行这个while循环。我们这里再看一下loop函数的代码:void EventLoop::loop(){ assert(!looping_); assertInLoopThread(); looping_ = true; quit_ =原创 2017-02-25 11:54:19 · 959 阅读 · 0 评论 -
C语言中的static函数
C语言是以文件文件为单位组织的,在一个源程序的所有文件中,一个外部变量和函数只能在源程序中定义一次。由于不同文件中的不同函数和变量很多时候都会相互引用,因此出现了static和extern关键字。这里主要介绍static函数,是对今天的一个编译问题的总结。学过C++ 应该都知道,类成员有三种类型:public,protected,private。其中private关键字表示该字段只能被原创 2016-07-02 19:44:24 · 5390 阅读 · 0 评论 -
linux epoll中事件触发机制
epoll是linux中的一个系统调用。是linux中的一种I/O复用方式,最早是出现在linux内核2.5.44中。早期的I/O复用主要是基于select和poll实现,但是select方式在在检测具体发生I/O/事件的描述符时,需要对所有的描述符进行循环检测,所以检测时间是描述符总数量的常数倍。epoll实现机制是,当某个描述符发生I/O事件时,直接将描述符加入到相应的链表中,因此应用程序在常原创 2016-06-17 16:29:08 · 2931 阅读 · 0 评论 -
Broken pipe 和 connection reset by peer
在TCP/IP协议中,在建立连接时需要经历三次握手,在断开连接时需要四次挥手。今天主要简单总结一下由于自己对四次挥手机制不太了解而出现的一些百思不得其解的问题。四次挥手的示意图如下原创 2016-07-04 17:33:17 · 2826 阅读 · 0 评论 -
muduo中buffer的设计
本文首先借用陈硕老师关于非阻塞网络编程中buffer的必要性的论述。然后再深入源码,分析buffer的实现Tcpconnection必须要有outputbuffer:想像一个场景:应用程序想向TCP连接发送100k数据,但是在write系统调用中,操作系统只接受80k数据。为了避免阻塞,我们肯定不想在这里阻塞。因为不知道要等多久。程序应该尽快交出控制权,返回eventloop,此时,剩下的20k数据原创 2017-02-27 21:12:45 · 1031 阅读 · 0 评论 -
muduo中TcpConnection里IO事件的处理
muduo里面对IO事件的处理核心在TcpConnection里面。因为TcpConnection主要是负责TCP连接,因此有关TCP连接上所有的socket读写都发生在TcpConnection中。根据前一节对Buffer的介绍,在这里我们将会看到muduo是怎么使用Buffer的。TcpConnection中有两个Buffer对象: Buffer inputBuffer_; Buffer原创 2017-02-28 23:07:55 · 722 阅读 · 0 评论 -
muduo 架构解析
muduo是一个基于Reactor模式的C++网络库。它采用非阻塞I/O模型,基于事件驱动和回调。它不仅是学习linux服务端多线程网络编程的入门资料,我们也可以通过它来学习C++11。 Reactor是网络编程的一般范式。我们这里从reactor模式为出发点,根据Reactor模式的特点剖析muduo的架构设计。根据wiki的定义: The reactor design patter原创 2017-02-23 16:24:23 · 8876 阅读 · 0 评论 -
muduo源码分析之事件处理器-Channel
前面两篇对Acceptor和TcpConnection的分析中,我们知道他们最终都是通过Channel和Eventpool简历连接,而且真正的事件处理函数也都是封装在Channel类中的。所以这里我把Channel看成事件处理器。 除了事件处理函数之外,Channel也是必须将可能产生事件的文件描述符封装在其中的。这里的文件描述符可以是file descriptor,可以是socket,还可以原创 2017-02-24 11:15:54 · 1125 阅读 · 0 评论 -
muduo源码解析之EventLoopThread
回到TcpServer,我们记得里面有一个Eventloopthreadpool,根据名字,这是一个线程池,它主要用于管理所有的eventloop,每个eventloop对应一个线程。当新连接到来时,Acceptor事件分发器将连接分发到合适的线程中。线程里面核心是执行Eventloop类里面的loop函数,这个函数主要是执行epoll_wait和一些其他的处理函数。loop是一个while循环。m原创 2017-02-24 15:52:41 · 1081 阅读 · 0 评论 -
Tars源码分析----Application
前言前言原创 2018-06-17 20:38:24 · 3409 阅读 · 1 评论