高性能高并发TCP服务器渐进式实战教程
文章平均质量分 71
通过一个系列系统的简洁教程让新手快速牢固掌握高并发服务器的编程模型精髓,从代码实用角度,从最简单的但客户服务器代码开始,到IO复用的epoll编程模型,一行一行代码渐进式解开socket网络服务器的神秘面纱。
wufeng_asia
这个作者很懒,什么都没留下…
展开
-
c++高并发tcp网络服务器实例渐进式教程-08
通过epoll实现的tcp服务器可以达到百万的并发量。著名的网络软件Nginx,Redis都是通过epoll方式实现的。下面继续通过我们的简单业务代码来演示epoll的用法。业务逻辑如下:Linux系统提供一下调用来创建和管理epoll:......原创 2022-07-12 16:49:10 · 858 阅读 · 0 评论 -
c++高并发tcp网络服务器实例渐进式教程-07
select虽然可以复用线程,但是存在两个致命缺点:这节课内容先介绍poll方式的IO复用模型我们的TCP服务器业务比较简单,代码架构简化模型如下:编译运行编译客户端代码:启动客户端:client1 的第一个参数是服务端的地址(192.168.199.160)fds一种结构体指针,这里表示结构体数组,结构体定义如下:nfdsnfds_t 是一个无符号整型。表示描述符索引边界。timeout超时时间返回值如果成功,返回有事件发生的描述符个数,即fds数组中元素的reven原创 2022-07-11 19:12:11 · 527 阅读 · 0 评论 -
c++高并发tcp网络服务器实例渐进式教程-06
所谓IO复用,复用的是线程,无论是accept的新链接事件,还是recv的可读事件,都可以在同一个线程中完成,不用引入新的独立线程。IO复用随着历史发展经历了3个主要阶段,即select(),poll(),epoll().这节课内容先介绍select方式的IO复用模型我们的TCP服务器业务比较简单,代码架构简化模型如下:服务器架构中只有一个主线程,主线程中有一个while死循环,while循环里面嵌套了一个有限的for循环。二 编译运行2.1 服务端编译运行编译客户端代码:启动客户端:cl原创 2022-07-08 13:15:24 · 1058 阅读 · 0 评论 -
c++高并发tcp网络服务器实例渐进式教程-05
上一节我们实现了一个较为高效的tcp服务器,主要架构是主线程负责接收新的客户端连接请求,把新链接放入任务队列中,子线程负责处理任务队列中每个tcp连接的数据收发任务。这样系统不必为每个连接申请单独的线程资源,大大提高了单台系统并发数。上一节的服务器是用阻塞io模式实现的,阻塞io模式是socket默认方式。如要要切换为非阻塞io模式需要手动添加代码现在我们用非阻塞io模式来实现上一节的tcp服务器。有同学会问,非阻塞io相比阻塞io有什么优势?我只能说优势是肯定有的,只不过我们当前服务器业务逻辑较为简单原创 2022-06-29 19:37:38 · 871 阅读 · 0 评论 -
c++高并发tcp网络服务器实例渐进式教程-04
上节我们介绍了一个多任务的TCP服务器,但是每个任务都会创建一个线程,系统的线程承载量是不高的,大几十个线程就可能压垮系统,这样无法实现我们高并发高性能TCP服务器的目标。这节内容我们继续在上一节的基础上改进我们的服务器。既然每个任务不能单独占用一个线程,那可以把所有响应任务放到单独一个子线程中处理,主线程只负责监听新的客户端连接,并把新的连接下放的子线程中处理。那主线程和子线程怎样交互呢?答案是添加一个任务队列,主线程把已经建立的连接放入任务队列中,子线程循环遍历任务队列,有连接存在就执行客户端以服务的数原创 2022-06-28 16:44:30 · 804 阅读 · 0 评论 -
c++高并发tcp网络服务器实例渐进式教程-03
上古TCP服务器上一篇的远古服务器,是单线程+阻塞IO模式的,一次只能连接一个客户端,无法同时为多个客户端提供连接。现在我们为每个客户端的连接新建一个线程,收发客户端数据都放在各自的线程里面,互不干扰。模式如下图:一 服务端编码//server2.cpp#include<unistd.h>#include<iostream>#include<sys/socket.h>#include<arpa/inet.h>#include<sign原创 2022-04-22 15:15:38 · 2838 阅读 · 0 评论 -
c++高并发tcp网络服务器实例渐进式教程-02
远古socket通信一 前言在计算机网络诞生不久的那个年代,计算机操作系统是单任务的,windows对应的是dos系统,一个时刻只允许运行一个进程,那时候的socket通信不存在并发的概念,就是单纯的串行socket通信。一个节点发送数据,一个节点接收数据。基本的socket通信建立流程如下:二 服务端2.1 服务端代码编写建立socket通信的步骤也是大多数教材的范例,以下是一个服务端的代码示例,我们可以简单回顾一下://server1.cpp#include<unistd.h原创 2022-04-21 11:09:32 · 3012 阅读 · 0 评论 -
c++高并发tcp网络服务器实例渐进式教程-01
一 概述对于socket网络编程刚入门的同学而言,初次看到阻塞,非阻塞,同步模型,异步模型,IO复用,reactor模型,select/poll/epoll这些概念,往往一脸懵逼,似懂非懂,最后啃完各种教程往往都自我感觉已经懂了,但是自己实际去编写一个高性能服务器代码时候,却不知道从何入手。以前看懂的,过段时间又忘记了。这些都是因为没有亲手实践过这些概念,网上的代码示例大多数都是新手写的,过于简单,千篇一律,更重要的是不成体系。想通过阅读nginx,redis等成熟开源代码学习,但动不动大几万规模的代码都原创 2022-04-20 10:44:00 · 4038 阅读 · 1 评论