精华内容
下载资源
问答
  • C++服务器开发

    千次阅读 2020-09-22 03:31:13
    2.让输出得对象合法,那就重载运算符,重要c++编程技巧 重载运算符ostream 3.左值引用是什么和为什么用const 自己思考 4.当私有变量,重载时候访问不到怎么办,友元函数 友元函数得作用就是使得...

    四天计划

    学习时候夯实基础

    学习时候求甚解,用得时候可以不用理解那么深

    在学习其他模块时候学习通用思想,命令

     

     

     

    行业共识

    day1

    1.cout是什么

    << 双目运算符,左移运算符  左右都是值,有一种特殊得值,cout本质就是对象

    2.让输出得对象合法,那就重载运算符,重要c++编程技巧

    重载运算符 ostream

    3.左值引用是什么和为什么用const

    自己思考

    4.当私有变量,重载时候访问不到怎么办,友元函数

    友元函数得作用就是使得  一个函数可以访问到对象私有成员属性

    工程开发中需要将成员得类设置成私有的

    //构造方法,友元,私有属性

     

    几点思考

    1.c++中现成的工具和方法,思考这些工具和方法它们是怎么实现的

    2,对现有c++知识的掌握和连接,知道语法特性

    3.c++程序来讲,工程代码中如何写,满足工程规范

    各种规范!!

    构造函数,先声明再实现这种规范

    c++是极其考验技术想象力的一门语言

    四大主流编程范式:

    面向过程、面向对象、泛型编程、函数式编程

    需要涉猎外部大量知识

    //------------暂时下面好像还有问题

    //------------暂时上面面好像还有问题

    怎么去学习c++

    算法数据结构思维、底层操作系统理解、网络知识巩固

    锻炼编程思维

    c++语法特性特别多,是为了支持四种编程范式的,可以将不同的语法特性归类到不同的编程范式中

    比如说学习c++语法时候按照编程范式学习c++语法和特性

    面向对象编程:类,对象,虚函数,友元函数,运算符重载,内存结构

    模板泛型编程:模板,模板中参数的自动推导,模板中的特殊技巧

    g++ add.cpp

    ./a.out

    编译、链接

    链接:就是刚好我有,你又需要,就被链接起来了

    C源码-->编译为对象文件-->链接为 可执行程序

    a.c[源码]    a.o[装定义]

    b.c             b.o

    链接就相当于把所有对象文件连接起来

    展示声明定义过程例子

    yum install gcc-c++

    g++ tt.cpp 编译链接全执行
    g++ -c tt.cpp

    定义:变量的声明,函数的声明

    nm -C main.o

    没语法错误就可以编译通过

    外部调用演示

    可以看到执行了乘法,然后也可以看到关于调用的绝配

    学习技术的时候,最重要的是学习错误

    编译时候错误,那就是语法错误,检查源文件

    链接时候两种错误,检查链接时候,对象文件相关

    未定义的标识符【比如说没有定义函数】

    重定义的标识符【比如说重复定义函数】

    定义作用在链接阶段,声明作用在编译阶段

    定义【源文件 .cpp】和声明【头文件 .h】之所以分开就是为了工程解耦

    技术学习理念,求甚解

    调用第三方功能模块

    初识google测试框架

    C源码  

    目标文件

    可执行程序           静态链接库  .a文件       

    头文件.h文件包含 C源码 目标文件 可执行程序

    git clone googletest

    rm -rf build

    mkdir build

    cd build

    cmake ../

    make

    cd ../

    cp -r lib/ ../../

    拿到定义部分

    再找头文件部分也就是声明部分

    引入google测试框架

    学习在怎么导入外部模块

    写两个测试用例

    缺少发现神奇的眼睛

    解决两个问题,声明和定义位置,如何未卜先知我实现了几个函数

     

    printf输出彩色文字

    颜色配置信息 + 显示文字

    \033  [ A1;A2;A3;...An m

    通用格式控制  前景色  背景色

    高亮黄色字,红色背景  \033[ 1;33;41m

    重置颜色属性,再设置自己的颜色

     

    工程开发0值代码,小细节,0值代码写到前面,0值代码写到后面,让这个代码不影响到其他代码颜色

    997367531截图加评价

    ma6174

    wget -qO- https://raw.github.com/ma6174/vim/master/setup.sh | sh -x

     

     

     

    展开全文
  • C++服务器开发完整学习路线

    千次阅读 2020-05-12 15:31:10
    C++服务器开发完整学习路线(含免费学习资料下载地址) 摘自:https://mp.weixin.qq.com/s/vkvQM8d78HBgJbUvY1KcLw 我看了下这里面高级阶段的nginx 容器我都接触过 原创 Buger 高并发学习社区 2019-06-04 视频...

    C++服务器开发完整学习路线(含免费学习资料下载地址)

    摘自:https://mp.weixin.qq.com/s/vkvQM8d78HBgJbUvY1KcLw

    我看了下这里面高级阶段的nginx  容器我都接触过

    原创 Buger 高并发学习社区 2019-06-04

    视频资料: 微信搜索公众号“高并发学习社区
    关注并且发送消息“视频” 。

     

    C++服务器开发完整学习路线(含免费学习资料下载地址)

    相信大部分同学刚毕业或者想转行做c++服务端开发的时候都很迷茫不知道从哪里开始学习,于是准备参加各种培训班或者网络培训,无奈动不动成千上万元的高昂的价格另人望而却步,对于在校学生或者刚出来就业的新人无疑是沉重都打击,最后决定自学,但是却不知道从哪里下手。我写这篇文章的目的就是为了帮助更多想入行或者想转行做c++服务器的新人避免走更多的弯路,最终能够顺利的掌握相关知识找到心仪的工作。

    一. 基础阶段  

    1. c/c++编程语言

    2. linux基础

    3. 数据结构与算法

    4. 设计模式

    5. 脚本语言(可选)

    二. 入门阶段  

    1. linux系统编程

    2. linux网络编程

    三. 进阶阶段  

    1. 数据库mysql

    2. 分布式缓存redis

    3. 网络库

    四. 项目实践阶段  

    1. 编写简单FTP服务器

    五. 高级阶段(可选)  

    1. nginx

    2. zookeeper

    3. 消息队列

    4. skynet

    5. boost  

    6. 负载均衡    

    7. 容器  

    8. rpc  

    9. 微服务  
      ……

    一. 基础阶段

    1. c/c++编程语言

    • c语言必备的入门书籍就是这本《C程序设计语言》  

    链接:http://vdisk.weibo.com/lc/3UlAHKgT3fnPf8rU7MV  
    密码:HCU3

    • 另外推荐一本比较经典的c语言书籍,可以选择性看一下《C陷阱与缺陷》  


      链接:http://vdisk.weibo.com/s/z1wkONlsC-2S3  

       

    • 既然是C++的学习路线,那么《C++ Primer》这本书肯定是必学不可的  


      链接:https://pan.baidu.com/share/init?surl=eQAdygU  
      密码:6mhv

       

    • 学了c++基础后,为了写出更高效的c++代码,那么就须要看这本书《Effective C++》  


      链接:https://pan.baidu.com/s/1X_hRLnyDnIUHrqY2b0xikQ  
      密码:9nim

       

    • 个人认为STL的原理非常重要,我推荐《STL源代码剖析》  


      链接:https://pan.baidu.com/s/1ndlM3QwPPR_qrZp3VV5SAA  
      密码:3ban

       

    • 另外推荐一本比较经典的c++书籍,可以选择性看一下《深度探索C++对象模型》  


      链接:https://pan.baidu.com/s/1eewVI  

       

    2. linux基础

    • linux系统安装和命令、工具使用  
      c++服务器程序基本都是运行在linux系统下面,所以对于linux的系统安装、命令工具等的使用要学会。  
      推荐《鸟哥的Linux私房菜-基础学习篇》  


      链接:https://pan.baidu.com/s/1pk1rw0NxXS2-1q-sfQRlPw    
      密码:dhwr

       

    • makefile编程    
      在软件开发中,make通常被视为一种软件构建工具。该工具主要经由读取一种名为“makefile”或“Makefile”的文件来实现软件的自动化建构。它会通过一种被称之为“target”概念来检查相关文件之间的依赖关系,这种依赖关系的检查系统非常简单,主要通过对比文件的修改时间来实现。在大多数情况下,我们主要用它来编译源代码,生成结果代码,然后把结果代码连接起来生成可执行文件或者库文件。  
      推荐《跟我一起学makefile》    
      链接:https://pan.baidu.com/s/18KSmdTHQhiw-Tng1RJxf1A  密码:526k

    3. 数据结构与算法

    • 入门推荐《大话数据结构》这本书,它的最大的特点是把理论讲得很有趣,不枯燥。而且每个数据结构和算法,作者都结合了生活中的例子,能让你有非常直观的感受。虽然这本书有 400 页,但是花两天时间读完应该是没问题的。所以,如果你之前完全不懂数据结构和算法,可以先从这本书看起。  

    链接:https://pan.baidu.com/s/1IB3xr4A4tcqPvAweaBN_hQ  
    密码:e729

    • 你也可以学习《数据结构和算法分析》。国内外很多大学都拿它当作教材。因为这本书非常系统、全面、严谨,而且又不是特别难,适合对数据结构和算法有些基本了解,并且掌握了至少一门编程语言的同学。而且,这个作者也很用心,他用了三种语言,写了三个版本,分别是:《数据结构与算法分析 : C 语言描述》、《数据结构与算法分析 : C++ 描述》、《数据结构与算法分析 : Java 语言描述》。  

     

    链接: https://pan.baidu.com/s/1K-SfpGsPSN-0JSq2zBfnzg  
    密码:mmp5

    4. 设计模式

    设计模式是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。  
    使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。  

     

    链接:https://pan.baidu.com/s/1_1ZzMnOCcs5NIAd3DqXpjw  
    密码:1vz9

    5. 脚本语言(可选)

    做c++开发很多情况下会和其他脚本语言做混合编程,特别是游戏公司以c++配合lua脚本编程作为主流,也有一些用python, 所以建议大家学一下这两门脚本语言

    • lua书籍推荐,包括入门书籍《lua程序设计》和深入原理书籍《lua设计与实现》  


      链接:https://pan.baidu.com/s/1iq2cPANIAQatVS0w2uGeGg  
      密码:35bt


    链接:https://pan.baidu.com/s/1OAIxhbtJcCDN7IioO3bGig  
    密码:xjg9

     

    • python书籍推荐 《python核心编程》  


      链接:https://pan.baidu.com/s/1qUYloocD4ygQlLnVlvP3nA  
      密码:rlhj

    二. 入门阶段

    1. linux系统编程

    linux下的编程你首先要学会文件和目录、标准I/O库、系统数据文件和信息、进程环境、进程控制、进程关系、信号、线程、线程控制、守护进程、各种I/O、进程间通信、网络IPC等方面的内容。  
    推荐《unix环境高级编程》  


    链接:https://pan.baidu.com/s/1zL_fL8GQYApD82RneXupGQ  
    密码:a6pc

     

    2. linux网络编程

    网络编程可以编写网络通讯程序,比如聊天程序、数据传输程序、文件传输程序等到;可以让你对网络通讯有更深的理解,当你遇到网络通讯方面的问题时,会有很深入的分析;为学习涌现很多分布式应用系统打下坚实的基础。  
    推荐《unix网络编程》(共两卷)  

     

    链接:https://pan.baidu.com/s/1QTrBUNBBHjDQMtq0G6Z6xA  
    密码:vznn

    三. 进阶阶段

    1. 数据库mysql

    • 入门推荐《MySQL必知必会》这是最好的数据库入门书,在Amazon上长期排在数据库销售榜首,建议想快速了解数据库原理和MySQL的新手阅读。快餐性质,简洁明快,小开本,而且很薄,比较好读。  


      链接:https://pan.baidu.com/s/1AiidwnxfzjzFzzqnnRhYrw  
      密码:y7mc

       

    • 怎么说,每个行业都有几本被翻来翻去的“街书”,而《mysql技术内幕》就是MySQL的“街书”。从源代码的角度深度解析了InnoDB的体系结构、实现原理、工作机制,并给出了大量最佳实践,能帮助你系统而深入地掌握InnoDB


    链接:https://pan.baidu.com/s/1k0j_hmkytJNpp_Htxsj9_w  
    密码:h01a

     

    • 《高性能mysql》作者推荐的工具、实战案例及经验过的诊断技术,可大大提高性能急救技能,以及加深对MySQL本质的理解。而且本书将数据库结构的客观方面纳入思考,此外还增补了MySQL高可用性及云特性  


    链接:https://pan.baidu.com/s/1vpZp90NOzlXgAR1LQOms0A  
    密码:jlyn

     

    2. 分布式缓存redis

    • 《Redis 设计与实现》一书全面而完整地讲解了 Redis 的内部运行机制, 对 Redis 的大多数单机功能以及所有多机功能的实现原理进行了介绍, 展示了这些功能的核心数据结构以及关键的算法思想。 通过阅读本书, 读者可以快速、有效地了解 Redis 的内部构造以及运作机制, 从而学会如何更高效地使用 Redis。  


      链接:https://pan.baidu.com/s/11JjvCzyRCx_xBl2hSAXrEQ  
      密码:19k0

       

    • 《redis实践》本书深入浅出地介绍了Redis的5种数据类型,并通过多个实用示例展示了Redis的用法。除此之外,书中还讲述了Redis的优化方法以及扩展方法。  


      链接:https://pan.baidu.com/s/1IfachFqYkRTQU0cjWJH-Vg  
      密码:qc28

       

    3. 网络库

    linux c/c++网络库比较多,有boost.asio、libevent、libev、libuv、muduo、ace等, 建议找一个代码比较少够精简的来反复学习,琢磨内部原理,有效提升网络编程能力。我自己反复研究了muduo网络库几遍收获不少,你们可以选libevent、libev、libuv、muduo中的一个学习即可,其中libev和muduo最为精简,容易学习。

    • libevent学习资源  
      Libevent源码分析专栏:https://blog.csdn.net/luotuo44/column/info/libevent-src/2    
      libevent-book:https://pan.baidu.com/s/1h-x1OrfiB-Jvb-YUvEghfg  密码:18wg

    • muduo学习资源    


      Linux多线程服务端编程:使用muduo C++网络库https://pan.baidu.com/s/17BLWk6ntscqY2iZHnUGe5w 密码: hknk    
      muduo使用手册:https://pan.baidu.com/s/1eM9Qhyr9hvOLgyklkYCqBw 密码:l4bn

       

    四. 项目实践阶段

    1. 编写简单FTP服务器

    2. 未完待续 … (后面更新请关注公众号“高并发之路”)

    五. 高级阶段(可选)

    1. nginx

    • Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;Nginx可以作为一个HTTP服务器进行网站的发布处理,另外Nginx可以作为反向代理进行负载均衡的实现。  
      推荐书籍《深入理解nginx模块开发与架构解析》  


      链接:https://pan.baidu.com/s/1FReO-fEJbnknNoQJHhNPkA  
      密码:6m7k

    2. zookeeper

    • ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。  


      链接:https://pan.baidu.com/s/1S5o9V5vCkoTlcoCJrfIuHg  
      密码:xlxo

    3. 消息队列

    • 当前使用较多的消息队列有RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq等, 我推荐两本kafka的书籍, 入门书籍《kafka权威指南》和深入的书籍 《Kafka技术内幕:图文详解Kafka源码设计与实现》  


      链接:https://pan.baidu.com/s/1ql44eTtUAtbBvMQGepMSBQ  
      密码:t210


    链接:https://pan.baidu.com/s/1fIEbmiQ-rogrLufbJ2hFGA  
    密码:hash

     

    4. skynet

    • Skynet是一个基于C跟lua的开源服务端并发框架, 现在很多游戏公司都在用它,特别是中小型的公司,棋牌公司,越来越多公司采用, 想往游戏方面发展建议认真学一下原理。  
      skynet wiki:https://github.com/cloudwu/skynet/wiki    
      skynet作者博客:https://blog.codingnow.com/eo/skynet/    
      skynet框架应用文章:https://blog.csdn.net/qq769651718/article/category/7480207

    5. 未完待续 … (后面更新请关注公众号“高并发学习社区”)

     

    微信扫一扫
    关注该公众号

    展开全文
  • C++服务器开发学习进阶路线和资料

    千次阅读 2019-06-16 17:14:26
    C++服务器开发完整学习路线(含免费学习资料下载地址) 相信大部分同学刚毕业或者想转行做c++服务端开发的时候都很迷茫不知道从哪里开始学习,这篇文章的目的就是为了帮助更多想入行或者想转行做c++服务器的新人...

    C++服务器开发完整学习路线(含免费学习资料下载地址)

    相信大部分同学刚毕业或者想转行做c++服务端开发的时候都很迷茫不知道从哪里开始学习,这篇文章的目的就是为了帮助更多想入行或者想转行做c++服务器的新人避免走更多的弯路,最终能够顺利的掌握相关知识找到心仪的工作。

    所有资料可以加群:783153655 (一线互联网架构交流群)获取。

    一. 基础阶段  

    1. c/c++编程语言

    2. linux基础

    3. 数据结构与算法

    4. 设计模式

    5. 脚本语言(可选)

    二. 入门阶段  

    1. linux系统编程

    2. linux网络编程

    三. 进阶阶段  

    1. 数据库mysql

    2. 分布式缓存redis

    3. 网络库

    四. 项目实践阶段  

    1. 编写简单FTP服务器

    五. 高级阶段(可选)  

    1. nginx

    2. zookeeper

    3. 消息队列

    4. skynet

    5. boost  

    6. 负载均衡    

    7. 容器  

    8. rpc  

    9. 微服务  
      ……

    一. 基础阶段

    1. c/c++编程语言

    • c语言必备的入门书籍就是这本《C程序设计语言》  

      C程序设计语言(原书第2版·新版 典藏版)

     

    • 另外推荐一本比较经典的c语言书籍,可以选择性看一下《C陷阱与缺陷》  

       

       

    • 既然是C++的学习路线,那么《C++ Primer》这本书肯定是必学不可的   

      学了c++基础后,为了写出更高效的c++代码,那么就须要看这本书《Effective C++》  


    • 个人认为STL的原理非常重要,我推荐《STL源代码剖析》  


    • 另外推荐一本比较经典的c++书籍,可以选择性看一下《深度探索C++对象模型》  

    •  

    2. linux基础

    • linux系统安装和命令、工具使用  
      c++服务器程序基本都是运行在linux系统下面,所以对于linux的系统安装、命令工具等的使用要学会。  
      推荐《鸟哥的Linux私房菜-基础学习篇》  


      makefile编程    

    • 在软件开发中,make通常被视为一种软件构建工具。该工具主要经由读取一种名为“makefile”或“Makefile”的文件来实现软件的自动化建构。它会通过一种被称之为“target”概念来检查相关文件之间的依赖关系,这种依赖关系的检查系统非常简单,主要通过对比文件的修改时间来实现。在大多数情况下,我们主要用它来编译源代码,生成结果代码,然后把结果代码连接起来生成可执行文件或者库文件。  
      推荐《跟我一起学makefile》    
       

    3. 数据结构与算法

    • 入门推荐《大话数据结构》这本书,它的最大的特点是把理论讲得很有趣,不枯燥。而且每个数据结构和算法,作者都结合了生活中的例子,能让你有非常直观的感受。虽然这本书有 400 页,但是花两天时间读完应该是没问题的。所以,如果你之前完全不懂数据结构和算法,可以先从这本书看起。  

     

    • 你也可以学习《数据结构和算法分析》。国内外很多大学都拿它当作教材。因为这本书非常系统、全面、严谨,而且又不是特别难,适合对数据结构和算法有些基本了解,并且掌握了至少一门编程语言的同学。而且,这个作者也很用心,他用了三种语言,写了三个版本,分别是:《数据结构与算法分析 : C 语言描述》、《数据结构与算法分析 : C++ 描述》、《数据结构与算法分析 : Java 语言描述》。  

    数据结构与算法分析:C语言描述(原书第2版)

     

    4. 设计模式

    设计模式是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。  
    使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。  

     

    5. 脚本语言(可选)

    做c++开发很多情况下会和其他脚本语言做混合编程,特别是游戏公司以c++配合lua脚本编程作为主流,也有一些用python, 所以建议大家学一下这两门脚本语言

    • lua书籍推荐,包括入门书籍《lua程序设计》和深入原理书籍《lua设计与实现》  

       

     

    • python书籍推荐 《python核心编程》  

       

    二. 入门阶段

    1. linux系统编程

    linux下的编程你首先要学会文件和目录、标准I/O库、系统数据文件和信息、进程环境、进程控制、进程关系、信号、线程、线程控制、守护进程、各种I/O、进程间通信、网络IPC等方面的内容。  
    推荐《unix环境高级编程》   

     

     

    2. linux网络编程

    网络编程可以编写网络通讯程序,比如聊天程序、数据传输程序、文件传输程序等到;可以让你对网络通讯有更深的理解,当你遇到网络通讯方面的问题时,会有很深入的分析;为学习涌现很多分布式应用系统打下坚实的基础。  
    推荐《unix网络编程》(共两卷)  

     

    三. 进阶阶段

    1. 数据库mysql

    • 入门推荐《MySQL必知必会》这是最好的数据库入门书,在Amazon上长期排在数据库销售榜首,建议想快速了解数据库原理和MySQL的新手阅读。快餐性质,简洁明快,小开本,而且很薄,比较好读。  

       

       

    • 怎么说,每个行业都有几本被翻来翻去的“街书”,而《mysql技术内幕》就是MySQL的“街书”。从源代码的角度深度解析了InnoDB的体系结构、实现原理、工作机制,并给出了大量最佳实践,能帮助你系统而深入地掌握InnoDB


     

    • 《高性能mysql》作者推荐的工具、实战案例及经验过的诊断技术,可大大提高性能急救技能,以及加深对MySQL本质的理解。而且本书将数据库结构的客观方面纳入思考,此外还增补了MySQL高可用性及云特性  

     

     

    2. 分布式缓存redis

    • 《Redis 设计与实现》一书全面而完整地讲解了 Redis 的内部运行机制, 对 Redis 的大多数单机功能以及所有多机功能的实现原理进行了介绍, 展示了这些功能的核心数据结构以及关键的算法思想。 通过阅读本书, 读者可以快速、有效地了解 Redis 的内部构造以及运作机制, 从而学会如何更高效地使用 Redis。  


      《redis实战》本书深入浅出地介绍了Redis的5种数据类型,并通过多个实用示例展示了Redis的用法。除此之外,书中还讲述了Redis的优化方法以及扩展方法。  

    •  

       

    3. 网络库

    linux c/c++网络库比较多,有boost.asio、libevent、libev、libuv、muduo、ace等, 建议找一个代码比较少够精简的来反复学习,琢磨内部原理,有效提升网络编程能力。我自己反复研究了muduo网络库几遍收获不少,你们可以选libevent、libev、libuv、muduo中的一个学习即可,其中libev和muduo最为精简,容易学习。

    • libevent学习资源  
      Libevent源码分析专栏:https://blog.csdn.net/luotuo44/column/info/libevent-src/2     
      libevent-book

    • muduo学习资源     


      Linux多线程服务端编程:使用muduo C++网络库
      muduo使用手册

       

    四. 项目实践阶段

    1. 编写简单FTP服务器

    2. 加群 783153655

    五. 高级阶段(可选)

    1. nginx

    • Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;Nginx可以作为一个HTTP服务器进行网站的发布处理,另外Nginx可以作为反向代理进行负载均衡的实现。  
      推荐书籍《深入理解nginx模块开发与架构解析》  


       

    2. zookeeper

    • ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。  

       


       

    3. 消息队列

    • 当前使用较多的消息队列有RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq等, 我推荐两本kafka的书籍, 入门书籍《kafka权威指南》和深入的书籍 《Kafka技术内幕:图文详解Kafka源码设计与实现》  

    •  

       

    4. skynet

    • Skynet是一个基于C跟lua的开源服务端并发框架, 现在很多游戏公司都在用它,特别是中小型的公司,棋牌公司,越来越多公司采用, 想往游戏方面发展建议认真学一下原理。  
      skynet wiki:https://github.com/cloudwu/skynet/wiki    
      skynet作者博客:https://blog.codingnow.com/eo/skynet/    
      skynet框架应用文章:https://blog.csdn.net/qq769651718/article/category/74802075.

    未完待续

       MongoDB

    memcache等等

    展开全文
  • c++应该怎样学习?c++服务器开发必备知识

    千次阅读 多人点赞 2019-05-17 10:40:09
    本文对c语言、c++语言开发基础知识点做了总结,同时作为服务器开发者必备的技能如:多线程、数据库、I/O多路复用、设计模式、tcp协议等原理进行了讲解。
    • 笔者从事软件开发工作5年,针对c++的特性、用途,整理的进阶式学习笔记,从浅入深地总结重点知识。
    • 本文旨在为c/c++初学者、初中级开发者和意在转型c++服务器研发的同学们,对基础知识和进阶路线进行详细的整理。适合c++初学者、c++中高级开发岗的同学学习、进阶和提升!

    文章目录

    • <注>:在恰当的场合使用恰当的特性

    c/c++服务器开发

    c语言

    宏定义

    	touch tmp
        cpp -dM ./tmp
        cpp -dM ./dummy.hxx | less		# 查看全部系统宏
    

    断言

    • C/C++程序员可以把assert看成一个在任何系统状态下都可以安全使用的无害测试手段,assert(断言)不是函数,而是宏。
    • 如果正确使用了断言assert,则若程序在assert处终止了,并不是说含有该assert的函数有错误,而是调用者出错了,assert在调试的时候可以帮助我们找到发生错误的原因。
        例如:assert(p != NULL);  
    
    • 建议:在编写函数时,要进行反复的考察,并且自问:“我打算做哪些假定?”,可能会隐藏的错误,当进行放错误设计时,如果“不可能发生”的事情的确发生了,则要使用断言进行报警。

    字节对齐

    c++语言

    c++初级

    命名空间

    面向对象编程思想

    类的封装

    构造与析构

    静态成员

    This指针

    友元函数与友元类

    运算符重载、函数重载

    继承与派生

    虚函数与多态

    函数模板与类模板

    输入输出流

    异常处理

    c++中/高级——c++标准库

    标准c++ I/O类(了解)

    • ios:抽象基类
    • istream:通用输入流和其他输入流的基类
    • ostream:通用输出流和其他输出流的基类
    • iostream:通用输入输出流和其他输入输出流的基类
    • ifstream:输入文件流类
    • ofstream:输出文件流类
    • fstream:输入输出文件流类
    • istrstream:输入字符串流类
    • ostrstream:输出字符串流类
    • strstream:输入输出字符串流类

    字符串string类

    • 数据结构

    数值类

    STL容器类(基本数据结构和原理)

    • vector: 每个元素在内存上是连续的,支持高效遍历、尾端插入和删除;
    (1)特点:
    	- 动态数组,在堆中分配内存,即使大小减小,内存也不会释放;如果新值 > 当前大小,会再分配内存;
    	- 内存的动态增长,首地址不变;
    	- 地址连续的顺序序列;
    	- 能够感知内存分配器的(Allocator-aware):
    		vector使用一个内存分配器对象来动态的处理存储需求;
    
    • list: 元素地址不连续,具有双链表结构,支持高效的随机插入/删除;
    (1)特点:
    	- 线性双向链表结构,有若干节点,每个节点包括一个信息块、一个前驱指针和一个后继指针;
    	- 不支持[]操作符和at()函数;
    	- 相对于vector,占用更多内存;(因为每个节点至少包含2个指针)
    
    • map: 关联容器,提供一对一的数据处理能力;
    (1)特点:
    	- map内部自建一颗红黑树(一种非严格意义上的平衡二叉树)
    		这棵树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的;
        - 根据key值快速查找记录,查找的复杂度基本是log(n),例如:
        	如果有1000个记录,最多查找10次;
            如果有1000000个记录,最多查找20次;
    
    • 队列:
    (1)queue: 是一个容器适配器类型
    	- 特点:
    		a.队列是一个容器适配器类型,被设计成用来运行FIFO(先进先出)场景;
    	- 队列在多线程中的应用:
    		a.生产——消费模型,实现解耦;
    (2)dequeue: 每个元素在内存上是连续的,支持高效遍历、首/尾端插入和删除;
    	- 双端队列的数据被表示为一个分段数组,容器中的元素分段存放在一个大小固定的数组中;
    	- 容器需要维护一个存放这些数组首地址的索引数组;
    	- 特点:
    		a.首地址的索引数组地址连续,双端队列本质上每一段的地址不连续;
    (3)priority_queue:优先队列
    	- 具有队列的所有特性,包括基本操作,在这基础上,增加了一个内部的排序,本质是一个堆实现的(默认是大顶堆)
    	- 特点:
    		a.队列中的最大元素总是位于首部(出队时,是将当前队列中最大的元素出队)
            b.元素的比较规则默认按照元素值由大到小排序(可以重载'<'来重新定义比较规则)
        	c.在默认的优先队列中,优先级高的先出队(在默认的int型中,先出队的为最大的数)
    

    STL算法库algorithm

    STL函数对象(仿函数)

    • 概念:
    (1)函数对象:
    	- 首先,是一个对象:即某个类的示例;
    	- 其次,函数对象的行为和函数一致:即可以像调用函数一样来使用函数对象(参数传递、返回值等),这种方式是通过重载类的'()'操作符实现的;
    (2)重载'()'操作符的类,它的对象叫做“函数对象”,即它是类似于函数的对象(可以像函数一样调用),称为“仿函数”;
    	<注>:函数对象(仿函数)是一个类,不是一个函数;
    (3)术语:
    	- 一元仿函数:重载'()'操作符有一个参数;
    	- 二元仿函数:重载'()'操作符有两个参数;
    	- 一元谓词: 返回值是bool类型的函数对象或普通函数,有一个参数;
    	- ...
    (4)STL内建的函数对象 #include <functional>
    	- 算数类函数对象:
    	- 关系运算类:
    	- 逻辑运算类:
    	<注>:用这些类的对象当做函数使用时,用法与函数完全相同;
    

    STL迭代器

    • 迭代器(iterator):是一种抽象的设计理念,通过迭代器可以在不了解容器内部原理的情况下遍历容器;
    • 抽象思想的经典应用:迭代器作为容器(vector、list等)与STL算法的“粘黏剂”,只要容器提供迭代器的接口,同一套算法代码可以利用在完全不同的容器中;
    • 实现:
    (1)内部构成 :
    	- 提供一个遍历容器内部所有元素的接口,因此内部必须保存一个与容器相关联的指针;
    	- 重载常用的运算符来方便遍历(其中最重要的是'*'、'->'和'++');
    	- 
    

    STL分配器(后续重点了解)

    本地化库

    异常处理类

    杂项支持库(非重点)

    c++精通(c++11/14/17新特性)

    nullptr

    • c++空指针
    • c的NULL与c++的nullptr:
    (1)区别:
    	- NULL在c++中,被明确定义为整数0;
    	- NULL在c中,被定义成 ((void*)0);(即:NULL实际上是一个void*指针);
    (2)特点:
    	- nullptr用于标识空指针,是std::nullptr_t类型的(constexpr)变量;
    	- nullptr可以转换成任何指针类型和bool类型;(主要为了兼容普通指针可以作为条件判断语句的写法)
    	- nullptr不能被转换为整数;
    

    constexpr(常量表达式)

    • constexpr修饰的是编译时期的常量;
    • const与constexpr的区别:
    (1)const为运行时常量,constexpr为编译时常量(与#define作用相同);
    	const和constexpr修饰的都是read-only的值,但:
        	- constexpr在程序执行前已经得到了具体的值;
        	- const在程序执行过程中,得到的具体值;
    
    • constexpr常量表达式的要求:
    	并非所有的函数都有资格成为常量表达式函数,具体要求如下:
    (1)函数体只有单一的return返回语句;
    (2)函数必须有返回值(即,不能为void函数);
    (3)在使用前必须已有定义;
    (4)return返回语句表达式中不能使用非常量表达式的函数、全局数据,并且必须是一个常量表达式;
    
    • constexpr的优势:
    (1)是一种很强的约束,更好的保证程序的正确语义不被破坏;
    (2)编译器可以在编译时对constexpr的代码进行非常大的优化,比如:将用到constexpr表达式都直接替换成最终结果;
    (3)相比宏定义来说,没有额外开销,但更安全可靠;
    

    auto

    • c++98 auto:(极少使用)
    • c++11 auto:
    (1)特点:
    	- auto可以在声明变量的时候,根据变量初始值类型,自动推断匹配的类型;
    		类似的关键字还有decltype;
            可以使用typeid(i).name()获得变量的类型;
        - auto的自动类型推断发生在编译时期,所以使用auto并不会造成程序运行时的效率问题;
    (2)用途:
    	- 用于代替冗长复杂、变量使用范围专一的变量声明;
    	- 在定义模板函数时,用于声明以来模板参数的变量类型;
    	- 用于模板函数依赖于模板参数的返回值
    		<注>:第二点和第三点是因为模板参数的类型是可变的,无法在函数内部形成统一的变量类型;
    (3)注意事项:
    	- auto变量必须在定义时初始化,这点类似与const;
    	- 定义在一个auto序列的变量,必须始终推导成同一类型;
    	- 如果初始化表达式是引用,则去除引用语义;
    	- 如果初始化表达式为const或volatile(或者两者兼有),则去除const/volatile语义;
    	- 如果auto关键字带上&号,则不去除const语义;
    	- 初始化表达式为数组时,auto关键字推导类型为指针;
    	- 若表达式为数组且auto带上&号,则推导类型为数组类型;
    	- 函数参数或模板参数不能被声明为auto;(c++11错误,c++14可以使用auto参数)
    

    decltype

    • 与auto关键字一样,用于进行编译时类型推导,它与auto的区别是:
    	- decltype的类型推导不像auto一样是从变量声明的初始化表达式获得变量的类型,而是总是以一个普通表达式作为参数,返回该表达式的类型;
    	- decltype不会对表达式进行求值;
    
    • decltype使用方法:
    	- 推导出表达式类型;
    		int i = 4;
            decltype(i) a;	// 推导结果为int,声明a变量的类型为int;
    	- 与using/typedef合用,用于定义类型;
    		using size_t = decltype(sizeof(0));	// sizeof(a)的返回值为size类型
    	- 重用匿名类型;
    		struct {
            	int d;
                double b;
            }anon_s;
            decltype(anon_s) as;	// 定义了一个上面匿名的结构体;
    	- 泛型编程中结合auto,用于追踪函数的返回值类型;(decltype的最大用途)
    		template<typename _Tx, typename _Ty>
            auto multiply(_Tx x, _Ty y)->decltype(_Tx*_Ty) {
            	return x*y;
            }
    
    • decltype推导的四条规则:
    (1)如果e是一个没有带括号的标记符表达式或者类成员访问表达式,那么decltype(e)就是e所命名的实体的类型;
    	此外,如果e是一个被重载的函数,则会导致编译错误;
    (2)否则,假设e的类型是T,如果e是一个将亡值,那么decltype(e)为T&&;
    (3)否则,假设e的类型是T,如果e是一个左值,那么decltype(e)为T&;
    (4)否则,假设e的类型是T,则decltype(e)为T;
    

    区间迭代(范围for循环)

    • string、array和所有的STL容器,都可以被新的区间迭代方式迭代;
    • 如果想让自己的数据结构使用区间迭代语法,则需要:
    	- 这个数据结构必须要有begin()和end()方法,成员方法和独立函数都可以,这两个方法分别返回开始和结束的迭代器;
    	- 迭代器支持'*'操作符、'!='操作符、'++'方法(前缀形式、成员函数和独立函数都可);
      实现这5个函数,就可以有一个支持区间迭代的数据结构。
      begin()和end()可以是非成员函数,甚至可以适配现有的数据结构,而不用实现STL风格的迭代器。
      因此,需要做的就是创建自己的支持*、前++和!=的嗲带起,并定义好自己的being()和end();
    
    • 区间迭代可以与STL中的for_each有着同样的性能;

    初始化列表

    模板增强

    • 模板函数的默认模板参数;
    • 外部模板:是c++11中一个关于模板性能上的改进;

    面向对象增强

    Lambda表达式

    • lambda表达式本质上就是重载了()运算符的类,称为“functor”,即行为像函数的类。因此,lambda表达式对象其实就是一个匿名的functor;
    • 说明:
    (1)构成:
    	- 一个标准的lambda表达式包括:
    		捕获列表:捕获外部变量列表;
            	值捕获、引用捕获和外部捕获;
            参数列表:形参列表;
            mutable指示符:用来说明是否可以修改捕获变量;
            exception:异常设定;
            尾置返回类型(->返回类型):返回类型;
            函数体:函数体
            [capture list](params list) mutable exception->return type {function body};
        - 根据反汇编分析,lambda表达式中的代码是在一个单独的函数中执行的,这个函数在调用时创建了自己的栈帧,而捕获的变量在其他的栈帧中(虽然通过ebp可以进行栈帧回溯,但显然是一种不合理的做法)。
    (2)注意:
    	- 如果lambda表达式中忽略括号和形参列表,则相当于指定的函数没有入参;
    	- lambda表达式中不能指定参数的默认值;
    	- 如果忽略返回值类型,则由编译器做自动类型推断;
    
    • 捕获列表:由于lambda表达式在某函数内定义的,因此会希望其能使用函数内部的局部变量,这时可以使用“捕获列表”
    	- 值捕获:
    		值捕获和参数传递中的值传递类似,被捕获的变量的值,在lambda表达式创建时通过值拷贝的方式传入,因此随后对该变量的修改不会影响lambda表达式中的值;
           	<注>:不能在lambda表达式中修改捕获变量的值;
        - 引用捕获:
        	使用引用捕获一个外部变量,需要在捕获列表变量前面加上一个引用说明符&;
        - 外部捕获(隐式捕获):
        	我们可以让编译器根据函数体中的代码来推断需要捕获哪些变量;
            隐式捕获有两种方式:
            	[=]:表示以值捕获的方式捕获外部变量;
                [&]:表示以引用捕获的方式捕获外部变量;
    

    函数对象包装器

    • 说明:
    	c++11 std::function是一种通用、多态的函数封装,它的示例可以对任何可以调用的目标实体进行存储、复制和调用;
        它也是对c++中现有的可调用实体的一种类型安全的包装(相对来说,函数指针的调用不是类型安全的);
        std::function是函数的容器,可以更加方便的将函数、函数指针作为对象进行处理;
    

    右值引用(std::move)

    • 右值引用
    • 左值和右值的区分标准:能否获取地址:
    	- 左值:可以获取地址的表达式,它能出现在赋值语句的左边,对该表达式进行赋值;
    		但是修饰符const的出现,使得可以声明如下标识符,它可以获取地址,但是没办法对其赋值:
            	const int& i = 10;
    	- 右值表示无法获取地址的对象,有常量值、函数返回值、lambda表达式等;无法获取地址,但不代表其不可改变,当定义了右值的右值引用时,就可以改变右值;
    
    • c++11增加了右值引用,右值引用关联到右值时,右值被存储到特定位置,右值引用指向该特定位置:
    	即: 右值虽然无法获取地址,但是右值引用是可以获取地址的,该地址表示临时对象的存储位置:(临时变量会引用关联到右值时,右值被存储到特定位置)
        	int && iii = 10;
    
    • 右值引用和移动语义:
    (1)说明:
    	- 在旧的c++中,出现了很多不必要的拷贝,因为在某些情况下,对象拷贝完成后就销毁了;
    	- c++11新标准,引入了移动操作,减少了很多复制操作,而右值引用正式为了支持移动操作为引入的新的引用类型;
    (2)std::move()函数:
    	- 根据右值引用的语法规则,不能将右值引用绑定到一个左值上,c++11引入右值引用,并且提供了std::move()函数,用来获得绑定到左值上的右值引用(即:为右值引用绑定到左值提供了可能)
    	- 该函数需要:#include <utility>
    		int &&iii = std::move(ii);
    
    • 右值引用的作用:
    	减少拷贝构造,赋值重载过程内存开辟拷贝的次数,提高执行速度;
    

    新增容器

    • array:
    • forward_list:
    • unordered_map:
    • unordered_set:
    • unordered_multimap:
    • unordered_multiset:
    • tuple(元组):

    智能指针

    • 理解智能指针:
    	作用:方便管理堆内存;
        三个层次:
        	- 较浅层面:
        		智能指针利用一种叫“RAII”(资源获取即初始化)的技术,对普遍的指针进行封装,这使得智能指针实质是一个对象,行为表现却像一个指针;
            - 智能指针的作用,是防止忘记调用delete释放内存和程序异常的进入catch块忘记释放内存。另外指针的释放时机也是非常有考究的,多次释放同一个指针会造成程序崩溃,这些都可以通过智能指针来避免;
            - 智能指针还有一个作用,是把值语义转换成引用语义;
    
    • 智能指针的分类:c++11新特性,需要包含头文件memory,有shared_ptr、unique_ptr和weak_ptr;
    	- shared_ptr:
    		a.特点:多个指针指向相同的对象;
           	b.shared_ptr内部使用引用计数,每一个shared_ptr的拷贝都指向相同的内存;
            	每使用一次,内部的引用计数加1,;每析构一次,内部的引用计数减1;
                当计数为0时,自动释放内存;后来指向的对象引用计数加1,指向后来的对象;
            c.拷贝和赋值:拷贝使得对象的引用计数加1,赋值使得原来对象的引用计数减1;
            d.可以使用get()函数获取原始指针;
            e.陷阱:避免循环引用:
            	shared_ptr的一个最大的陷阱就是循环引用;
                循环引用会导致堆内存无法正确释放,导致内存泄露(看weak_ptr);
    	- unique_ptr:
    		a.特点:唯一的拥有其所指对象,同一时刻只能有一个unique_ptr指向给定对象(禁止拷贝语义,只有移动语义来实现);
            b.相比于原始指针unique_ptr用于其RAII的特性,使得在出现异常的情况下,动态资源能得到释放;
            c.unique_ptr指针本身的生命周期:从unique_ptr指针创建时开始,直到离开作用域;
            	离开作用域时,若其指向对象,则将其所指向的对象销毁(默认使用delete操作符,用户可以指定其他操作)。
            d.unique_ptr指针与其所指对象的关系:
            	在智能指针生命周期内,可以改变智能指针所指对象,如:创建智能指针时通过构造函数指定、通过reset方法重新指定、通过release方法释放所有权、通过移动语义转义所有权;
    	- weak_ptr:
    		a.特点:是为了配合shared_ptr而引入的一种智能指针,因为它不具有普通指针的行为:
            	没有重载operator*和->;
            b.weak_ptr最大的作用在于:协助shared_ptr工作,像旁观者那样观测资源的使用情况;
            c.weak_ptr可以从一个shared_ptr或者另一个weak_ptr对象构造,获得资源的观测权(weak_ptr是shared_ptr的友元类(friend));
            d.weak_ptr没有共享资源,它的构造不会引起指针引用计数的增加;
            e.使用weak_ptr的成员函数:
            	use_count()可以观测资源的引用计数;
                expired()的功能等价于use_count()==0,但是更快,表示被观测的资源(即:shared_ptr管理的资源)已经不存在;
                lock():weak_ptr重要的成员函数,它从被观测的shared_ptr获得一个可用的shared_ptr对象,从而操作资源。
                	但当expired()==true时,lock()函数将返回一个存储空指针的shared_ptr;
    
    • 循环引用问题:案例
    • 所有的智能指针都会重载->和*操作符;

    正则表达式库(了解)

    语言级线程支持

    • 对标准库的扩充:
    	- std::thread
    	- std::mutex/std::unique_lock
    	- std::future/std::packaged_task
    	- std::condition_variable
    

    结构化绑定(c++17)

    多线程和线程池

    进程和线程

    • 进程是操作系统分配存储资源的最小单元;
    • 线程是程序执行、cpu调度的最小单元;
    • 进程和线程

    线程池原理:

    I/O原理

    socket网络编程

    • c/c++网络编程,基本使用的是linux系统函数实现

    linux系统函数

    • 服务器启动流程:
    	- socket():	创建一个socket,并设置地址描述、socket类型和协议;
    	- bind():	绑定socket,并设置绑定的ip和端口;(服务器一般设置为INADDR_ANY)
    	- listen():	设置监听套接口,并设置监听队列的大小;
    	- accept():	接受连接,并设置客户端地址结构;
    	- read():	接收数据,并设置接收缓存区和大小;
    	- write():	发送数据,并设置发送缓存区和大小;
    
    • 设置已创建socket的属性:
    setsockopt():
    (1)用于任意类型、任意状态套接口的设置。j尽管在不同协议层上存在选项,但本函数仅定义了最高的"高接口"层次上的选项。
    (2)应用举例:
    	- 设置调用close(socket)后,仍可继续重用该socket。调用close(socket)一般不会立即关闭socket,而经历TIME_WAIT的过程。
    		BOOL bReuseaddr = TRUE;
    		setsockopt( s, SOL_SOCKET, SO_REUSEADDR, ( const char* )&bReuseaddr, sizeof( BOOL ) );
    	- 如果要已经处于连接状态的soket在调用closesocket()后强制关闭,不经历TIME_WAIT的过程:
    		BOOL bDontLinger = FALSE;
    		setsockopt( s, SOL_SOCKET, SO_DONTLINGER, ( const char* )&bDontLinger, sizeof( BOOL ) );
    	- 在send(),recv()过程中有时由于网络状况等原因,收发不能预期进行,可以设置收发时限:
    		int nNetTimeout = 1000; //1秒
    		//发送时限
    		setsockopt( socket, SOL_SOCKET, SO_SNDTIMEO, ( char * )&nNetTimeout, sizeof( int ) );
    		//接收时限
    		setsockopt( socket, SOL_SOCKET, SO_RCVTIMEO, ( char * )&nNetTimeout, sizeof( int ) );
    	- 在send()的时候,返回的是实际发送出去的字节(同步)或发送到socket缓冲区的字节(异步);系统默认的状态发送和接收一次为8688字节(约为8.5K);在实际的过程中如果发送或是接收的数据量比较大,可以设置socket缓冲区,避免send(),recv()不断的循环收发:
    		// 接收缓冲区
    		int nRecvBufLen = 32 * 1024; //设置为32K
    		setsockopt( s, SOL_SOCKET, SO_RCVBUF, ( const char* )&nRecvBufLen, sizeof( int ) );
    		//发送缓冲区
    		int nSendBufLen = 32*1024; //设置为32K
    		setsockopt( s, SOL_SOCKET, SO_SNDBUF, ( const char* )&nSendBufLen, sizeof( int ) );
    	- 在发送数据的时,不执行由系统缓冲区到socket缓冲区的拷贝,以提高程序的性能:
    		int nZero = 0;
    		setsockopt( socket, SOL_SOCKET, SO_SNDBUF, ( char * )&nZero, sizeof( nZero ) );
    	- 在接收数据时,不执行将socket缓冲区的内容拷贝到系统缓冲区:
    		int nZero = 0;
    		setsockopt( s, SOL_SOCKET, SO_RCVBUF, ( char * )&nZero, sizeof( int ) );
    	- 一般在发送UDP数据报的时候,希望该socket发送的数据具有广播特性:
    		BOOL bBroadcast = TRUE;
    		setsockopt( s, SOL_SOCKET, SO_BROADCAST, ( const char* )&bBroadcast, sizeof( BOOL ) );
    	- 在client连接服务器过程中,如果处于非阻塞模式下的socket在connect()的过程中可以设置connect()延时,直到accpet()被调用(此设置只有在非阻塞的过程中有显著的作用,在阻塞的函数调用中作用不大)
    		BOOL bConditionalAccept = TRUE;
    		setsockopt(s, SOL_SOCKET, SO_CONDITIONAL_ACCEPT, (const char*)&bConditionalAccept, sizeof( BOOL ) );
    	- 如果在发送数据的过程中send()没有完成,还有数据没发送,而调用了close(socket),以前一般采取的措施是shutdown(s,SD_BOTH),但是数据将会丢失。某些具体程序要求待未发送完的数据发送出去后再关闭socket,可通过设置让程序满足要求:
            struct linger {
            	u_short l_onoff;
            	u_short l_linger;
            };
    		struct linger m_sLinger;
    		m_sLinger.l_onoff = 1; //在调用close(socket)时还有数据未发送完,允许等待
    		// 若m_sLinger.l_onoff=0;则调用closesocket()后强制关闭
    		m_sLinger.l_linger = 5; //设置等待时间为5秒
    		setsockopt( s, SOL_SOCKET, SO_LINGER, (const char*)&m_sLinger, sizeof(struct linger));
    

    多路I/O复用

    同步和异步、阻塞和非阻塞

    • 同步和异步: 描述的是”用户线程“和”内核“的交互方式;
    	同步:指用户线程发起I/O请求后,需要”等待“或”轮询“内核I/O操作完成后才能继续执行;
        异步:指用户线程发起I/O请求后,仍可继续执行,当内核I/O操作完成后会通知用户线程,或调用用户线程注册的回调函数;
    
    • 阻塞和非阻塞: 描述的是”用户线程“调用”内核I/O“操作的方式
    	阻塞:指I/O操作需要彻底完成后才能返回到用户空间;
        非阻塞:指I/O操作被调用后立即返回给用户一个状态值,无需等待I/O操作彻底完成;
    

    基础——常见的I/O模型

    • 同步阻塞I/O: 传统I/O模型;
    (1)特点:
    	- 用户线程在内核进行I/O操作时被阻塞;
    	- 属于请求应答式
    (2)缺点:
    	- 用户需要等待read将socket中的数据读取到buffer后,才继续处理接收的数据;
    	- 整个I/O请求过程中,用户线程是被阻塞的,这导致用户在发起I/O请求时,不能做任何事情,对cpu的资源利用率不够;
    
    • 同步非阻塞I/O: 默认创建的socket都是阻塞的,非阻塞I/O要求socket被设置成NONBLOCK;
    (1)特点:
    	- 是在同步阻塞I/O基础上,将socket设置为NONBLOCK,这样用户线程可以在发起I/O请求后立即返回;
    	- 用户线程发起I/O请求时立即返回,但并未读取到任何数据,用户线程需要不断的发起I/O请求,直到数据到达后,才能真正读取到数据,继续执行;
    (2)缺点:
    	- 用户需要不断的调用read,尝试读取socket中的数据;
    	- 整个I/O请求的过程中,虽然用户线程每次发起I/O请求后可以立即返回,但是为了等到数据,仍需要不断的轮询、重复请求,消耗了大量的cpu资源;
    (3)一般很少直接使用这种模型,而是在其他I/O模型中使用非阻塞I/O这一特性;
    
    • I/O多路复用:经典的Reactor设计模式,也被称作“异步阻塞I/O”,代表为linux的epoll;
    (1)特点:
    	- I/O多路复用是建立在内核提供的多路分离函数select()基础之上;
    	- 使用select()函数可以避免同步非阻塞I/O模型中轮询等待的问题;
    	- select函数与同步阻塞模型没有太大区别,甚至添加了监视socket,以及调用select()函数的额外操作,效率更差;
    		但是,使用select()以后最大的优势,就是用户可以在一个线程内同时处理多个socket的I/O请求;
            用户可以注册多个socket,然后不断的调用select()读取被激活的socket,即:
            	可以达到在同一个线程内同时处理多个I/O请求的目的;
            而在同步阻塞模型中,必须通过多线程方式才能达到这个目的;
    (2)缺点:
    	- 虽然上述方式允许单线程内处理多个I/O请求,但是每个I/O请求过程还是阻塞的(在select()函数上阻塞),平均时间甚至比同步阻塞I/O模型还要长;
    (3)如果用户线程只注册自己感兴趣的socket或I/O请求,然后去做自己的事,等到数据到来时再进行处理,则可以提高CPU的利用率;
    	I/O多路复用模型使用了Reactor设计模式实现了这一机制;
    (4)Reactor设计模式:
        	通过Reactor的方式,可以将用户线程轮询I/O操作状态的工作统一交给handle_events事件循环进行处理;
            用户线程注册事件处理器之后,可以继续执行其他的工作(异步过程),而Reactor线程负责调用内核的select()函数检查socket状态,当有socket被激活时,则通知相应的用户线程(或执行用户线程的回调函数),执行handle_event进行数据读取、处理等工作;
    (5)由于select()函数是阻塞的,因此多路I/O复用也被称为”异步阻塞I/O模型“;(这里的阻塞,指的是select()函数执行时线程被阻塞,而不是指socket)
    (6)I/O多路复用是最常使用的I/O模型,但是其异步程度还不够”彻底“,因为它使用会阻塞线程的select()系统调用,因此I/O多路复用只是异步阻塞I/O,而不是真正的异步I/O;
    
    • 异步I/O: 经典的Proactor设计模式,也被称作”异步非阻塞I/O“;
    	真正的异步I/O需要操作系统更强的支持;
    (1)特点:
    	- 在I/O多路复用模型中,事件循环将文件句柄的状态事件通知给用户线程,由用户线程自行读取、处理数据;
    		而在异步I/O模型中,当用户线程收到通知时,数据已经被内核读取完毕,并放在了用户线程指定的缓冲区内,内核在I/O完成后通知用户线程直接使用即可;
        异步I/O模型使用了Proactor设计模式实现了这一机制;
    (2)Proactor与Reactor的区别:
    	- Proactor和Reactor在结构上比较相似,不过在用户使用方式上差别较大;
    	- Reactor模式中,用户线程通过向Reactor对象注册感兴趣的事件监听,然后事件触发时调用事件处理函数;
    	- Proactor模式中,用户线程间asyncchronousOperation(读/写等)、Proactor以及操作完成时的CompletionHandler注册到asyncchronousOperationProcessor;
    		asyncchronousOperationProcessor使用Facade模式,提供了一组异步操作API(读/写等)供用户使用;
            当用户线程调用异步API后,便继续执行自己的任务;asyncchronousOperationProcessor会开启独立的内核线程执行异步操作,实现真正的异步;
            当异步I/O操作完成时,asyncchronousOperationProcessor将用户线程与asyncchronousOperation一起注册的Proactor和CompletionHandler取出,然后将ComletionHandler与I/O操作的结果数据一起转发给Proactor,Proactor负责回调每一个异步操作事件完成处理函数handle_event;
        - 虽然Proactor模式中每个异步操作都可以绑定一个Proactor对象,但是在一般系统中,Proactor实现为Singleton模式,以便于集中化分发操作完成事件;
    (3)相比I/O多路复用模型,异步I/O并不很常用,不少高性能并发服务程序使用”I/O多路复用买模型+多线程任务处理“的架构基本可以满足需求;
    	并且,目前操作系统对异步I/O的支持并非特别完善,更多的采用I/O多路复用模型”模拟“(例如:boost::asio)异步I/O的方式(I/O事件触发时,不直接通知用户线程,而是将数据读写完毕后,放到用户指定的缓冲区中;)
    

    select和epoll

    • I/O多路复用:
    	I/O多路复用(又被称为“事件驱动”):
        	操作系统提供了一个功能,当某个socket可读或可写的时候,会发出一个通知。这样当配合非阻塞的socket使用时,只有当系统通知了哪个描述符fd可读了,才执行read操作,可以保证每次read都能读到有效的数据,而不做仅仅返回-1和errno的无用功;
        写操作类似,操作系统通过select/poll/epoll等系统调用来实现,这些函数都可以同时监控多个描述符fd的读写就绪状态;
        这样,多个描述符fd的I/O操作都能在一个线程内并发交替的完成,即:I/O多路复用;
        这里的“复用”指的是复用同一个线程。
    
    (1)特点:
    	select系统调用的目的是:在一段指定时间内,监听用户感兴趣的描述符fd上可读、可写和异常事件;
        poll和select,都可以阻塞式的、同时探测一组支持非阻塞的IO设备,直到某一个设备触发了事件或超过了指定的等待事件————即:他们的职责不是做I/O,而二十帮助调用者找到当前就绪的设备;
    (2)select优点:
    	- select是windows socket中最常见的模型,可以等待多个套接字;
    (3)select缺点:
    	- 每次调用select,都需要把fd集合,从用户态拷贝到内核态,在拷贝大量fd时开销很大;
    	- 同时每次调用select,都需要在内核遍历传递进来的所有fd,在遍历大量fd时开销很大;
    	- select支持的文件描述符数量小,默认只有1024;
    
    <核心>:epoll作为select的linux的替代品,解决了selectfd_set的限制。性能优于select。
    (1)特点:
    	epoll是linux下I/O多路复用接口select/poll的增强版本,它能显著减少程序在大量并发连接中,只有少量活跃的情况下,系统CPU的利用率,原因如下:
        	a. 它不会复用文件描述符fd集合来传递结果,而迫使开发者每次等待事件之前都必须重新准备要监听的文件描述符fd集合;
            b. 在获取事件时,它无须遍历整个被监听的描述符fd集合,而是只要遍历那些被内核I/O事件异步唤醒而加入Ready队列的描述符fd集合就行;
        epoll除了提供select/poll的I/O事件的Level Triggered(电平触发)外,还提供了Edge Triggered(边沿触发),这就使得用户空间程序有可能缓存I/O状态,减少epoll_wait/epoll_pwait的调用,提高应用程序效率;
    (2)epoll优点:
    	- 支持一个进程打开大量的socket描述符;
    	- I/O效率不随fd数目增加而线性下降;
    	- 内核微调;
    (3)工作模式:epoll有2中工作方式:LT和ET;
    	- LT(默认工作方式):
    		同时支持block和non-block socket;
            这种做法,内核告诉用户线程文件描述符fd是否就绪,然后线程可以对这个就绪的fd进行I/O操作;
            如果不做任何操作,内核还会继续通知。(只要有数据就不停的通知,	直到没有数据了就不再通知了)
            因此,这种模式编程出错的可能性要小;
            传统的select/poll都是基于此;
    	- ET(高速工作方式):
    		只支持non-block socket;
            这种做法,当描述符从未就绪变为就绪时,内核通过epoll告诉用户线程,然后它会假设线程知道文件描述符已经就绪,并不会再为那个文件描述符发送更多的就绪通知,直到线程做了某些操作导致那个文件描述符不再为就绪状态(比如:在发送、接收或接收请求、发送接收的数据少于一定量时,导致了一个EWOULDBLOCK错误);
            但是,如果一直不对这个fd做I/O操作(从而导致它再次变成未就绪),内核不会发送更多的通知(only once);
            不过在TCP协议中,ET模式的加速效果仍需要更多的benchmark(基准)确认;
    (4)epoll接口:
    	epoll的接口非常简单,共有三个函数:
        	- int epoll_create(int size);
        		创建一个epoll句柄,会占用一个fd值,linux下查看/proc/进程id/fd/,是能够看到对应的fd的;
                return: int epfd;
               	所以在使用完epoll后,必须调用close()关闭,否则可能导致fd被耗尽;
        	- int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
        		epoll的事件注册函数,它不同于select():
                	select是在监听事件时告诉内核要监听什么类型的事件;
                    epoll是先注册要监听的事件类型;
        	- int epoll_wait(int epfd, struct epoll_event *event, int maxevents, int timeout);
        		等待事件的产生,类似于select()调用;
    (5)epoll框架的使用方式:
    	前提:包含头文件 #include <sys/epoll.h>
        a. 通过epoll_create(int maxfds)来创建一个epoll句柄,maxfds为epoll所支持的最大句柄数;
        	这个函数会返回一个新的epoll句柄,之后的所有操作都将通过这个句柄来进行;
            在用完之后,需要调用close()来关闭这个epoll句柄;
        b. 在用户程序的网络主循环中,每一帧的调用epoll_wait()来查询所有的网络接口,看哪一个可读,哪一个可写;
        	基本的语法为:nfds = epoll_wait(kdpfd, events, max_events, -1)
           	其中:
            	- kdpfd: 用epoll_create()创建后的句柄;
            	- events: 是一个epoll_event*的指针,当epoll_wait()函数操作成功后,events里面将存储所有的读写事件;
            	- max_events:是当前需要监听的所有socket句柄数;
            	- timeout:是epoll_wait的超时,为0时马上返回,这里-1表示一直等待,直到有事件返回;
            	一般情况下,如果网络主循环是单独的线程,可以用-1来等待,这样可以保证效率;
                如果主逻辑与网络主循环是同一个线程的话,则可以用0来保证主循环的效率;
        c. epoll_wait()返回之后应该是一个循环,遍历所有的事件;
    

    数据库

    (1)主要区别:
    	- 存储方式:
    		sql数据存在特定结构的表中;
            nosql则更加灵活和可扩展,存储方式可以是JSON文档、哈希表或其他方式;
        - 表/数据集合的数据关系:
        	sql中,必须定义好表和字段结构后才能添加数据,例如:
            	主键(primary key)、索引(index)、触发器(trigger)、存储过程等;
            nosql中,数据可以在任何时候、任何地方添加,不需要先定义表;
            nosql也可以在数据集中建立索引,如:
            	MongoDB中,会在数据集合创建后,自动创建唯一值_id字段,这样就可以在数据集创建后增加索引;
            <注>: 该区别表明,nosql更适合初始化数据还不明确或未定义的项目中;
        - 外部数据存储:
       		sql中,如果需要增加外部关联数据,规范化做法是在原表中增加一个外键,关联外部数据表;
            nosql中,除了这种规范化的外部数据表做法外,还可以用非规范化方式把外部数据直接放到原数据集中,以提高查询效率;(缺点是:更新审核人数据时很麻烦)
        - JOIN查询:
        	sql中,可以用JOIN表链接方式,将多个关系数据表中的数据,用一条简单的指令执行;
            nosql暂未提供类似JOIN的查询方式,所以大部分nosql使用非规范化的方式存储数据;
        - 数据耦合性:
        	sql不允许删除已经被使用的外部数据;(强耦合)
            nosql没有这种强耦合的概念,可以随时删除任何数据;
        - 事务:
        	sql中,如果多张表数据需要同批次被更新,即:要么都成功,要么都失败。可以在所有指令完成后,再统一提交事务;
            nosql中没有事务这个概念,每一个数据集的操作都是“原子级”的;
        - 查询性能:
        	在相同水平的系统设计下,因为nosql中省略了类似JOIN查询的小号,所以理论上性能是优于sql的;
    

    sql

    mysql(数据结构和原理)

    (1)介绍:
    	- mysql数据库引擎取决于mysql在安装时是如何被编译的;
    	- 数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务,从而满足大多数需要处理大量数据的应用程序的要求。
    	- 使用数据库引擎创建用于联机事务处理或联机分析处理数据的关系型数据库,包括:
    		创建用于存储数据的表和用于查看、管理和保护数据安全的数据库对象(如:索引、视图和存储过程)
    (2)分类:
    	- ISAM:
    	- MyISAM(非聚集索引):
    		是mysql的ISAM扩展格式和默认的数据库引擎;
            MyISAM强调快速读取操作,在web开发中所进行的大量数据操作都是读取操作,所以,大多数虚拟机提供商和INTERNET平台提供商只允许使用MyISAM格式;
    	- HEAP:
    		允许只驻留在内存里的临时表格,驻留在内存里让HEAP要比ISAM和MyISAM要块;
    	- InnoDB(聚集索引):
    		InnoDB和BEARKLEYDB(BDB)都是造就mysql灵活性的技术的直接产品,即:MYSQL++ API;
            InnoDB和BDB包括了对事务处理和外来键的支持,这两点都是ISAM和MyISAM都没有的;
    (3)聚集索引和非聚集索引:
    	- 聚集索引:
    		物理地址连续存放的索引,在取区间的时候,查找速度非常快;
            但是插入速度慢;
    	- 非聚集索引:物理位置使用链表来进行存储;
    
    	对mysql优化,是一个综合性的技术,主要包括:
        - 表的设计合理化(符合3NF);
        - 添加适当的索引(index);	// 有4种:普通索引、主键索引、唯一索引unique、全文索引;
        - 分表技术:水平分割、垂直分割;
        - 读写分离;
        - 存储过程:模块化编程,提高访问速度;
        - 对mysql配置优化:(例如:配置最大并发数my.ini、调整缓存大小);
        - mysql服务器硬件升级;
        - 定期清除不必要的数据,定时进行碎片整理(MyISAM);
    

    nosql

    • 特点:面向对象或集合

    redis(数据结构和原理)

    (1)开启允许局域网访问:
    (2)开启/关闭主从关系:
    (3)哨兵功能:
    			涉及到“分布式选举”;
    

    网络编程

    tcp协议栈

    • 位码即TCP标志位,有6种:
    	- ACK(acknowledgement):确认
    	- PSH(push):传送
    	- FIN(finish):结束
    	- RST(reset):重置
    	- URG(urgent):紧急
    	- SYN(synchoronous):建立联机
    	- Sequence Number:顺序号码
    	- Acknowledge Number:确认号码
    

    web服务器开发

    三次握手

    • 三次握手

    四次挥手

    • 四次挥手

    socket状态转换过程

    (1)正常开启:
    	- 初始时,Client和Server的TCP状态都是CLOSED;
    	- S端首先socket、bind、listen,listen后,S tcp状态会变成LISTEN,执行被动打开
    	- S端调用accept,阻塞等待tcp有连接完成;
    	- C端socket、connect,connect会阻塞到tcp的三次握手完成;
    	- 在C tcp发送第一个SYN报文时,C tcp状态变为SYN_SEND,为主动打开一方;
    	- S tcp收到C tcp的SYN后,状态由LISTEN变为SYN_RCVD,并执行发送回复(SYN K, ACK J+1);
    	- C tcp收到回复时,状态变为ESTABLISHED(数据传输状态),并回复确认(ACK K+1)
    		然后connect()函数返回,这时客户端的tcp连接创建完毕,可以向该socket收发数据
        - S tcp收到3次握手的最后一个确认后,状态变为ESTABLISHED,至此,S端的accept返回,返回已连接的socket(区分socket返回的监听套接字);
    (2)正常关闭:
    	- C调用close,C tcp向S tcp发送FIN报文,状态变为FIN_WAIT_1,主动关闭;
    	- S tcp收到FIN后,状态变为CLOSE_WAIT,并回复确认,此为被动关闭。
    		若此时S端正在阻塞read此套接字,read将返回0;
        - S端调用close()或退出进程,使S tcp向C tcp发送FIN,S tcp状态变为LASK_ACK;
        - C tcp收到S tcp发送的FIN后,状态变为TIME_WAIT,并对此FIN发送确认;
        	在等待 2×MSL 后,状态变为CLOSED,在此期间内,所有此socket pair的报文被丢弃(新建的、旧的);
        - S tcp收到最后的ACK后,状态变为CLOSED;
    (3)异常情况:
    	- accept返回前连接终止
    	- S端进程终止
    	- SIGPIPE信号
    	- S主机崩溃
    	- S主机崩溃后重启
    	- S主机关机
    

    与I/O多路复用结合

    开源库

    常用设计模式

    创建型模式(重点)

    Factory工厂模式

    Singleton单例模式

    结构型模式

    Bridge桥接模式

    Adapter适配器模式(重点)

    Decorator装饰器模式

    Composite组合模式

    Proxy代理模式

    行为模式

    Template模板模式

    Strategy策略模式

    Observer观察者模式(重点)

    Visitor访问者模式

    Chain of Responsibility职责链模式(重点)

    Iterator迭代器模式(重点)

    Interpreter解释器模式

    • 感谢@njczy2010、@jiayayao、@慢慢爬的小蜗牛、@yofer张耀琦、@Rayen0715、@番茄汁汁、@wxquare、@天空101、@艾露米婭娜、@A_carat_tear、@LeechanXBlog、@han_cui、@jaycekon、@yx0628、@wllenyj、@qing101hua的博客文章
    展开全文
  • c++服务器开发 之一 概要介绍

    千次阅读 2016-03-09 21:56:08
    c++服务器开发 之一 概要目录介绍 背景  指的是普通的c++服务器开发,不涉及特定的需求,仅涉及需要实现大众功能的系统。  假设读者对c++的基础概念都有所了解 基础技术、相关的库和模型介绍  回调、同步、...
  • C++服务器开发完整学习路线(含免费学习资料下载地址) 相信大部分同学刚毕业或者想转行做c++服务端开发的时候都很迷茫不知道从哪里开始学习,于是准备参加各种培训班或者网络培训,无奈动不动成千上万元的高昂的...
  • 我发觉需要区分单纯的Linux c/c++服务器开发和嵌入式软件工程师里面要求的要会Linux多线程编程等等的,一个毕竟是纯服务器的,一个是嵌入式软件工程师,还是有区别的。 这也就像王道课程和华清课程的区别,华清...
  • c++服务器开发环境搭建

    千次阅读 2013-11-27 09:24:58
    tar -jxvf gcc-4.8.1.tar.bz2 cd gcc-4.8.1 ./contrib/download_prerequisites ..../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib make -j4(改数字由你的核数*2) sudo mak
  • c++服务器开发之TCP

    千次阅读 2019-03-22 11:16:59
     TCP协议是全双工协议,客户端可以往服务器发送,服务器也可以发送给客户端,有可能出现一种半关闭情况,一方可以接受另外一方的消息,但是他不发送消息出去,为了完全断开连接,只接受不发送那方要告诉另外一方...
  • sudo apt-get install libgoogle-...http://dev.mysql.com/downloads/connector/cpp/ mysql c++ connector i修正一下路径:sudo ldconfig  查看backserverd依赖: ldd backserverd
  • linux下 c++ 服务器开发(一)

    万次阅读 2016-12-03 00:01:12
    苦逼的c++程序员还没找到工作,所以顺便开始写服务器练手。。 1.我的电脑是win10的,所以先去网上下虚拟机,我下载了 ,然后安装了。 2.新建了一个ubuntu 32位的虚拟电脑。(我划分的是固定大小硬盘,幸好我划...
  • linux下 c++ 服务器开发(三)

    千次阅读 2016-12-04 23:41:27
    服务器(Server)程序是重点,宗旨就是写出服务器程序,让服务器程序越来越厉害。。  不知道先写哪个好,那就两个一起开吧,切换着写。。 服务器这边毫无头绪,不过看了下qt这边的项目文件,就学着也弄个...
  • linux下 c++ 服务器开发(四)

    千次阅读 2016-12-05 16:55:35
    开始客户端这边的网络编程了,就是在之前的注册按钮的触发事件里添加与QTcpSocket相关的操作,用QTcpSocket很方便的,服务器那边准备用Linux提供的Socket接口,那样才达到锻炼的效果。 先来看下QTcpSocket的介绍:...
  • linux下 c++ 服务器开发(二)

    千次阅读 2016-12-03 19:51:37
    既然有敲代码的vim了,又有编译器gcc/g++可以编译c++程序了,应该可以开始写服务器了。。 首先,服务器是什么东西呢?服务器是一种软件,一种程序,长期稳定地运行在某台计算机上面,特点就是处理大量的...
  • C++web服务器开发

    千次阅读 2019-08-14 08:55:56
    C++web服务器开发 1. 首先介绍一下这个项目;这个项目是通过C++11编写的web服务器,模型为Reactor+非阻塞I/O(epoll作为I/O多路复用实现方式)+线程池,支持get、head请求,支持HTTP长连接,并实现了优雅关闭连接。 ...
  • C++游戏服务器开发常用工具介绍在软件开发过程中需要使用的工具类型实属众多,从需求建模到软件测试,从代码编译到工程管理,这些工具都对项目有着不可替代的作用。庄子有云,“吾生也有涯,而知也无涯,以有涯随无...
  • linux c++ 服务器开发面试必看书籍

    千次阅读 2019-09-18 16:54:51
    linux c++ 服务器开发面试必看书籍 打算慢慢把这些书看完。 题外话: 推荐一个 github 上的 开源书籍,有各种语言版本的,建议看 英文版 ,当然也有 中文版 非常之棒!! 一、算法基础系列 数据结构基础(C语言版)...
  • Linux服务器c++开发之路 正式开始学习Linux高并发服务器c++开发相关的技术。 学习路线:  基础数据结构 gcc, make, gdb Qt编程 Tcp/IP协议 c/c++语言 ---> c/c++实战项目 ---> Linux基础入门 --->...
  • C++服务器开发技能

    千次阅读 2014-02-17 15:31:36
    Linux C++服务器开发技术   1、基本知识:掌握C/C++语法,熟悉STL标准库、ACE库、Boost库。 2、应用技能:多线程编程、网络编程、Oralce数据库、内存管理、正则表达式。 3、内功修炼:算法与数据结构、操作系统...
  • Linux C++服务器开发技术

    千次阅读 2012-02-14 10:01:53
    Linux C++服务器开发技术 1、基本知识:掌握C/C++语法,熟悉STL标准库、ACE库、Boost库。 2、应用技能:多线程编程、网络编程、Oralce数据库、内存管理、正则表达式。 3、内功修炼:算法与数据结构、...
  • C++游戏服务器开发

    千次阅读 2018-11-30 14:42:57
    018. 服务器开发需要用到的部分shell命令(第一部分) 019. 服务器开发需要用到的部分shell命令(第二部分) 020. 服务器开发需要用到的部分shell命令(第三部分) 021. 服务器开发需要用到的部分shell命令(第四...
  • 分享一篇文章: linux C/C++服务器后台开发面试题总结
  • C++服务器和客户端开发 参考:thrift下C++服务器和客户端开发 参考:ThriftUsageC++ 参考:Thrift 入门教程 Thrift环境搭建: Ubuntu环境下Thrift的安装、编译以及测试 ubuntu下thrift的安装 RPC框架之...
  • C++游戏服务器开发视频教程

    千次阅读 2018-07-13 18:18:31
    课程目录:├─100-详解12 聊天室服务器02 网络库asio 14_recv.mkv├─101-详解13 聊天室服务器对应的客户端 网络库asio 15_recv.mkv├─102-详解14 聊天室服务器对应的客户端2 网络库asio 16_recv.mkv├─103-详解15...
  • 服务器&客户端现实中有许多软件是分为客户端和服务器两部分,常见的比如Mysql,分为Mysql Client和Mysql Server,Client负责输入命令和结果显示,Server负责存储数据和返回查询结果。再比如网络游戏,玩一款游戏需要...
  • 跨平台服务器程序的作用所谓跨平台,主要指Windows和Linux两个主要平台。如今绝大多数服务器后端程序运行在Linux平台,这是因为Linux...但是在开发过程中,大部分开发者更习惯使用Windows平台的Visual Studio(简称VS)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 196,541
精华内容 78,616
关键字:

c++服务器开发

c++ 订阅