"C/C++后端开发"这张图,爆了!

大家好,我是唐唐。

今天先给大家看C/C++后端开发的,长文预警,发车~

路线图

开局一张图,内容全靠编,没错,咱们先来看一张全局图,先从总体上有个宏观的认识。

这张图有点大,由于微信对图片压缩的厉害,看不清楚没关系,下面会分割各种小图讲解

我将学习路线分为基础进阶拓展三大部分,每一部分又分为两个阶段,总共分为了六个阶段来进行。

第一阶段:基础

在我看来,相对来说,Python、Java这类上层语言是面向业务编程,而C/C++这类底层语言更多是面向计算机编程,所以第一个基础阶段需要补充一些计算机的基础知识,这个阶段我的建议是这样的:

计算机体系架构基础

首先,初学者需要了解计算机的基本常识和最基本的工作原理,像图灵机、冯诺伊曼体系架构,就属于这个范畴。

接着,还需要了解现代计算机的一些基本要素,比如计算机总线系统、数据信息的存储与表示,常见的CPU体系架构与指令集、程序的基本概念、编程语言的发展历史,类型等等。

这一部分的知识,可以参考的书目有:

  • 《计算机组成原理》

  • 《计算机存储与外设》

  • 《深入理解计算机系统》

当然,上面这些书的内容其实有很多,一开始不用太过深入,不用想着把书看完,那是一个巨大的工作量,对新手来说也是不现实的,一开始了解我上面提到的内容就可以了。

Linux基础

上面是偏理论的知识,在这个小节,初学者可以开始来学习使用Linux了,做C/C++后端开发,那必然是要经常与Linux打交道的。

对新手而言,这个小节,主要是学习基本使用为主,旨在从熟悉的Windows切换到陌生的Linux系统,大家可以使用虚拟机软件在里面安装Ubuntu、CentOS来学习。需要学习的有了解下Linux基本的操作,常用的命令,权限管理基本概念,到后面可以使用命令开发一些简单的shell脚本等等。

这一部分的知识,可以参考的书目有:

  • 《鸟哥的linux私房菜》

C语言基础

接下来,咱们可以正式来接触C语言编程了。

C语言是计算机编程的基础,虽然语法本身的知识点并不多,但想要学好,光学会语言本身远远不够,其背后涉及的复杂庞大的计算机系统知识才是大头。在这一个小节,咱们只是迈出万里长征第一步,掌握基本的语法知识,能顺利的编写一些简单程序即可。

这一部分的知识,可以参考的书目有:

  • 《C与指针》

计算机网络基础

第一阶段的最后一部分,是时候来学习一些计算机网络的知识。

作为基础阶段,这一小节主要从宏观上学习计算机网络,而不是死扣某一个协议的某些字段意义。

首先从局域网出发,了解计算机通信的基本网络——以太网,局域网内是如何通信的?集线器、交换机有什么区别?MAC地址、IP地址、子网、子网掩码分别是做什么用的?

随后引出更大的广域网、互联网,什么是网络通信协议,通信协议分层的问题,通过七层和四层模型快速建立起计算机网络的基础概念,各层协议的作用,分别有哪些协议,这些协议在当今的互联网中具体是怎么应用的。

这一部分的知识,可以参考的书目有:

  • 《计算机网络-自顶向下法》

  • 《TCP/IP协议详解·卷一》

第一阶段的学习到此为止,新手通过上面几个基础课程,开始建立起对计算机和编程的初步认知。

第二阶段:基础

第二阶段还是打基础,这个阶段中,一方面在第一阶段之上,进行一些提升,另一方面是继续扩展学习需要掌握的基础课程。

C++基础

有了C语言的基础,这个阶段开始可以进入C++的学习。

基本上所有人都知道,C++是一门很复杂的课程,感觉永远也无法全部掌握。作为基础阶段,这一小节主要的目标是掌握C++最基本的面向对象编程即可。

面向对象的几个基本概念,继承、封装、多态、重载,以及友元、虚函数、引用与指针的区别,RAII编程技法,STL经典容器和迭代器的使用,到这里,能够编写基本的C++程序,能看懂C++项目源码就可。

这一部分的知识,可以参考的书目有:

  • 《C++ Primer》

数据结构与算法

C和C++的基础具备了,是时候来接触一下数据结构与算法了。

这部分内容初学者可能觉得有些枯燥,但千万要顶住,这是每一个程序员必须翻过的一座山。

常用的数据结构都在下面的图中了,首先通过学习数据结构的基本定义,从理论上了解每个数据结构的应用场景,各自的特点。

接着,可以看一下牛客网上的《剑指Offer》和LeetCode,通过刷题来掌握常见数据结构的使用。

这一部分的知识,可以参考的书目有:

  • 《大话数据结构》

  • 《数据结构与算法分析》

编译原理

代码是如何变成CPU执行的指令的?可执行文件是如何构建的?这类问题需要学习编译原理才能了解,做C/C++开发多少需要了解一些编译原理的知识。

数据库基础

基础阶段的最后一部分,可以来接触一些数据库的基础知识了。

这个阶段主要学一些理论知识,重点掌握库、表、索引等概念,然后学习SQL的编写,学会增删改查数据。暂时不用编程来操作数据库。

这一部分的知识,可以参考的书目有:

  • 《数据库系统概念》

第三阶段:进阶

经过前面两个阶段,这个时候你已经具备基本的编程知识,计算机系统、网络、数据库、编程语言、数据结构与算法都打过交道,可以开始比较正式的项目开发了。

接下来,开始进入第三个阶段:进阶。在这个阶段,主要是对之前学习的内容进行提升,学习的内容将更加深入。

操作系统基础

是时候开始和操作系统见面了,有了前面编程基础的铺垫,可以思考我们编写的程序,操作系统是如何来管理运行的。

进程与线程是什么、进程的地址空间布局是什么样的、虚拟内存是什么东西,内核态与用户态又是什么意思,操作系统又是如何如何处理系统调用、中断与异常的,这些知识都藏在操作系统这门课中。

这一部分的知识,可以参考的书目有:

  • 《现代操作系统》

  • 《Linux内核设计与实现》

  • 《Windows内核原理与实现》

C++进阶

前面我们学习了C++基础,但那个时候,还只是停留在入门级,关于C++的高阶知识,在进阶阶段该来安排一下了。

把上面这部分内容掌握了,C++这门语言,你基本就上路了。

这一部分的知识,可以参考的书目有:

  • 《C++沉思录》

  • 《深度探索C++对象模型》

  • 《Effective C++》

线程堆栈

学C/C++,光学语言不行,还得知道程序执行的底层原理。这一小节的内容,可以帮助你深入了解代码和数据在内存中的执行过程和原理,对理解计算机工作原理非常有帮助。

调试技术

一个优秀的程序员,一定也是一个调试高手。调试技术是每个程序员必须掌握的一项技能,这里的进阶内容,建议学习一下软件调试的原理,操作系统和CPU为调试提供的技术支持,GDB常用命令需要掌握,特定环境下排查问题非常管用。

如果有精力,可以简单了解一下汇编语言,在调试时候,如果能看懂汇编指令,也是大有裨益。

这一部分的知识,可以参考的书目有:

  • 《软件调试》

  • 《软件调试的艺术》

  • 《汇编语言》

数据结构与算法进阶

基础阶段接触了常用的数据结构与算法,在进阶阶段将接触一些更加复杂的算法,也是各大公司面试中出镜率极高的内容。

这一部分的知识,可以参考的书目有:

  • 《啊哈!算法》

  • 《算法导论》

第四阶段:进阶

第四阶段,开始全面提升编程能力,这部分的内容都是偏实战化的,也是跟操作系统密切相关的部分,一方面需要继续补充学习操作系统相关的编程知识,另一方面需要通过大量编程和项目实际开发经历来锤炼提升。

网络编程

网络编程,socket编程,各种网络IO模型的区别与底层原理,尤其是epoll模型中的各种细节问题,需要摸得非常熟悉。

多进程与多线程编程

多线程与多进程技术,Linux上的fork机制、pthread线程库、C++的thread库、线程同步技术,这都需要在实际编程中去掌握学习。

进程间通信

多进程必然涉及进程间通信,进程间通信常用的方式有哪些?各自的原理是什么?这也是面试中经常出现的考题。

RPC与序列化技术

网络编程和多进程通信之中常用RPC和序列化技术,业界常用的几大RPC框架和序列化技术都可以学习使用下,比较它们的原理异同,各自的优劣势等等。

计算机网络进阶

学到这个阶段,对计算机网络的学习需要进一步加深。在之前的基础之上,更加专注一些重点协议的实现原理,关键的通信过程,比如TCP、HTTP等这些重点协议是需要重点研究的对象。

在这个阶段,你还需要学习使用抓包软件抓取网络数据包,实际的观察学习网络中的数据,加深对网络通信的理解和认知。

这一部分的知识,可以参考的书目有:

  • 《计算机网络-自顶向下法》

  • 《TCP/IP协议详解·卷一》

第五阶段:拓展

完成前面四个阶段,你完全可以开始开发一些更大型的项目了。在第五阶段,主要是拓展学习一些与后端开发相关的知识。

设计模式

开始接触大型项目开发后,建议补充学习一下设计模式的知识,有助于提升编程架构能力,写出更加优秀的代码。

课本上的设计模式有二十多种,但精力有限的情况下,挑选一些主要经常打交道的即可。

这一部分的知识,可以参考的书目有:

  • 《设计模式:可复用面向对象软件的基础》

  • 《Head First 设计模式》

网络安全

做C/C++编程,建议补充学习一些跟网络安全相关的知识,加解密技术、数字签名技术、常见的软件漏洞原理等等,拓展一下相关的知识面。

计算机底层技术

C/C++因为是比较底层的语言,经常需要与CPU、操作系统这些打交道,经常开发一些系统底层程序,所以了解学习一些计算机底层知识,对自己计算机系统知识的构建非常有帮助,也对将来在工作中遇到实际问题能提供一些更加底层的视角去分析看待问题。

这一部分的知识,可以参考的书目有:

  • 《计算机组成原理》

  • 《计算机存储与外设》

  • 《深入理解计算机系统》

第六阶段:拓展

这个阶段,再来学习一些C/C++后端开发技术栈中经常打交道的第三方组件,比如数据库、缓存系统等等。不仅仅学会使用,还要掌握了解它们的底层原理,这个时候,前面所学的计算机底层知识在这里就能派上用场了。

MySQL

MySQL是互联网中应用非常多的数据库系统,在基础阶段只学习了数据库的理论知识和SQL的用法。

到这个阶段,需要更加深入,研究MySQL的底层原理,索引实现原理、事务实现原理、锁机制等等,不仅能用,还要能在开发大型项目遇到数据库性能问题时,了解原理更好的解决问题。

这一部分的知识,可以参考的书目有:

  • 《高性能MySQL》

  • 《MySQL技术内幕·InnoDB存储引擎》

  • 《MySQL必知必会》

Redis

Redis作为MySQL的好搭档,缓存系统的主流选择,其重要性越来越强了。

除了基本的使用,还需要学习一下Redis背后的原理,内存数据结构如何实现,持久化、高可用、集群扩展、分布式锁如何实现等等问题都值得研究。一方面Redis作为非常优秀的开源软件,其本身就非常值得借鉴学习,另一方面学习背后的实现原理,对实际工作中解决问题也有非常大的帮助。

这一部分的知识,可以参考的书目有:

  • 《Redis设计与实现》

其他第三方组件

除了MySQL和Redis,其他常见的后端开发软件有下面这些,有时间也建议学习下,一边学使用,一边学原理:

总结

以上就是做C/C++后端开发,从新手入门到工作所需要学习的内容整理了,可能并不全面,但掌握以上这些内容足以胜任大部分的岗位要求了。

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先要理解基本的原理,2台电脑间实现TCP通讯,首先要建立起连接,在这里要提到服务器端与客户端,两个的区别通俗讲就是主动与被动的关系,两个人对话,肯定是先有人先发起会话,要不然谁都不讲,谈什么话题,呵呵!一样,TCPIP下建立连接首先要有一个服务器,它是被动的,它只能等待别人跟它建立连接,自己不会去主动连接,那客户端如何去连接它呢,这里提到2个东西,IP地址和端口号,通俗来讲就是你去拜访某人,知道了他的地址是一号大街2号楼,这个是IP地址,那么1号楼这么多门牌号怎么区分,嗯!门牌号就是端口(这里提到一点,我们访问网页的时候也是IP地址和端口号,IE默认的端口号是80),一个服务器可以接受多个客户端的连接,但是一个客户端只能连接一台服务器,在连接后,服务器自动划 分内存区域以分配各个客户端的通讯,那么,那么多的客户端服务器如何区分,你可能会说,根据IP么,不是很完整,很简单的例子,你一台计算机开3个QQ,服务器怎么区分?所以准确的说是IP和端口号,但是客户端的端口号不是由你自己定的,是由计算机自动分配的,要不然就出现端口冲突了,说的这么多,看下面的这张图就简单明了了。 在上面这张图中,你可以理解为程序A和程序B是2个SOCKET程序,服务器端程序A设置端口为81,已接受到3个客户端的连接,计算机C开了2个程序,分别连接到E和D,而他的端口是计算机自动分配的,连接到E的端口为789,连接到D的为790。 了解了TCPIP通讯的基本结构后,接下来讲解建立的流程,首先声明一下我用的开发环境是Visual Studio2008版的,语言C#,组件System.Net.Sockets,流程的建立包括服务器端的建立和客户端的建立,如图所示: 二、实现: 1.客户端: 第一步,要创建一个客户端对象TcpClient(命名空间在System.Net.Sockets),接着,调用对象下的方法BeginConnect进行尝试连接,入口参数有4个,address(目标IP地址),port(目标端口号),requestCallback(连接成功后的返调函数),state(传递参数,是一个对象,随便什么都行,我建议是将TcpClient自己传递过去),调用完毕这个函数,系统将进行尝试连接服务器。 第二步,在第一步讲过一个入口参数requestCallback(连接成功后的返调函数),比如我们定义一个函数void Connected(IAsyncResult result),在连接服务器成功后,系统会调用此函数,在函数里,我们要获取到系统分配的数据流传输对象(NetworkStream),这个对象是用来处理客户端与服务器端数据传输的,此对象由TcpClient获得,在第一步讲过入口参数state,如果我们传递了TcpClient进去,那么,在函数里我们可以根据入口参数state获得,将其进行强制转换TcpClient tcpclt = (TcpClient)result.AsyncState,接着获取数据流传输对象NetworkStream ns = tcpclt.GetStream(),此对象我建议弄成全局变量,以便于其他函数调用,接着我们将挂起数据接收等待,调用ns下的方法BeginRead,入口参数有5个,buff(数据缓冲),offset(缓冲起始序号),size(缓冲长度),callback(接收到数据后的返调函数),state(传递参数,一样,随便什么都可以,建议将buff传递过去),调用完毕函数后,就可以进行数据接收等待了,在这里因为已经创建了NetworkStream对象,所以也可以进行向服务器发送数据的操作了,调用ns下的方法Write就可以向服务器发送数据了,入口参数3个,buff(数据缓冲),offset(缓冲起始序号),size(缓冲长度)。 第三步,在第二步讲过调用了BeginRead函数时的一个入口参数callback(接收到数据后的返调函数),比如我们定义了一个函数void DataRec(IAsyncResult result),在服务器向客户端发送数据后,系统会调用此函数,在函数里我们要获得数据流(byte数组),在上一步讲解BeginRead函数的时候还有一个入口参数state,如果我们传递了buff进去,那么,在这里我们要强制转换成byte[]类型byte[] data= (byte[])result.AsyncState,转换完毕后,我们还要获取缓冲区的大小int length = ns.EndRead(result),ns为上一步创建的NetworkStream全局对象,接着我们就可以对数据进行处理了,如果获取的length为0表示客户端已经断开连接。 具体实现代码,在这里我建立了一个名称为Test的类: 2.服务器端: 相对于客户端的实现,服务器端的实现稍复杂一点,因为前面讲过,一个服务器端可以接受N个客户端的连接,因此,在服务器端,有必要对每个连接上来的客户端进行登记,因此服务器端的程序结构包括了2个程序结构,第一个程序结构主要负责启动服务器、对来访的客户端进行登记和撤销,因此我们需要建立2个类。 第一个程序结构负责服务器的启动与客户端连接的登记,首先建立TcpListener网络侦听类,建立的时候构造函数分别包括localaddr和port2个参数,localaddr指的是本地地址,也就是服务器的IP地址,有人会问为什么它自己不去自动获得本机的地址?关于这个举个很简单的例子,服务器安装了2个网卡,也就有了2个IP地址,那建立服务器的时候就可以选择侦听的使用的是哪个网络端口了,不过一般的电脑只有一个网络端口,你可以懒点直接写个固定的函数直接获取IP地址System.Net.Dns.GetHostAddresses(System.Net.Dns.GetHostName())[0],GetHostAddresses函数就是获取本机的IP地址,默认选择第一个端口于是后面加个[0],第2个参数port是真侦听的端口,这个简单,自己决定,如果出现端口冲突,函数自己会提醒错误的。第二步,启动服务器,TcpListener.Start()。第三步,启动客户端的尝试连接,TcpListener.BeginAcceptTcpClient,入口2个参数,callback(客户端连接上后的返调函数),state(传递参数,跟第二节介绍的一样,随便什么都可以,建立把TcpListener自身传递过去),第四步,建立客户端连接上来后的返调函数,比如我们建立个名为void ClientAccept(IAsyncResult result)的函数,函数里,我们要获取客户端的对象,第三步里讲过我们传递TcpListener参数进去,在这里,我们通过入口参数获取它TcpListener tcplst = (TcpListener)result.AsyncState,获取客户端对象TcpClient bak_tcpclient = tcplst.EndAcceptTcpClient(result),这个bak_tcpclient我建议在类里面建立个列表,然后把它加进去,因为下一个客户端连接上来后此对象就会被冲刷掉了,客户端处理完毕后,接下来我们要启动下一个客户端的连接tcplst.BeginAcceptTcpClient(new AsyncCallback(sub_ClientAccept), tcplst),这个和第三步是一样的,我就不重复了。 第二个程序结构主要负责单个客户端与服务器端的处理程序,主要负责数据的通讯,方法很类似客户端的代码,基本大同,除了不需要启动连接的函数,因此这个程序结构主要启动下数据的侦听的功能、判断断开的功能、数据发送的功能即可,在第一个程序第四步我们获取了客户端的对象bak_tcpclient,在这里,我们首先启动数据侦听功能NetworkStream ns= bak_tcpclient.GetStream();ns.BeginRead(data, 0, 1024, new AsyncCallback(DataRec), data);这个跟我在第二节里介绍的是一模一样的(第二节第10行),还有数据的处理函数,数据发送函数,判断连接已断开的代码与第二节也是一模一样的,不过在这里我们需要额外的添加一段代码,当判断出连接已断开的时候,我们要将客户端告知第一个程序结构进行删除客户端操作,这个方法我的实现方法是在建立第二个程序结构的时候,将第一个程序结构当参数传递进来,判断连接断开后,调用第一个程序结构的公开方法去删除,即从客户端列表下删除此对象。 第一个程序结构我们定义一个TSever的类,第二个程序结构我们一个TClient的类,代码如下:TSever类

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值