c++
文章平均质量分 94
Alpha205
非计算机专业,学过的东西,做一点记录
展开
-
TCP/IP网络编程(11) 套接字和标准IO
此外,为了使用标准的IO函数,需要传入FILE结构体指针,而在创建套接字的时候,默认返回的是文件描述符,因此需要额外将文件描述符转换为FILE指针。套接字中的缓冲区主要是为了实现TCP协议而设立的,TCP在传输数据的过程中,如果丢失了数据,将会再次进行传输,而再次发送数据,意味着数据保存在了某个地方,并没有丢失,保存的地方就是套接字的输出缓冲区。使用标准IO函数还有一个好处,就是可以按字符串单位进行交换,而在前面的回声服务器的示例代码中,接收到的数据需要先转换为字符串(在数据的尾部插入0)。原创 2022-12-29 11:07:49 · 610 阅读 · 4 评论 -
TCP/IP网络编程(10) IO函数
在Linux下,一般使用read & write函数完成数据IO,因为Linux下的套接字,可视为文件,其操作方式与文件类似,当套接字分配之后,会为其分配对应的文件描述符。在Windows下,则需要使用recv & send函数完成数据IO。原创 2022-11-17 22:12:31 · 985 阅读 · 0 评论 -
Linux下GDB调试程序
GDB(全称:GNU Debugger)是GNU工程师为GNU操作系统开发的调试器。它可以用于调试C、C++、Objective-C、Pascal、Ada等语言编写的程序。原创 2022-08-20 19:01:40 · 1724 阅读 · 0 评论 -
TCP/IP网络编程(9) 进程间通信
但是,进程具有完全独立的内存结构,即使通过fork()函数创建的子进程,也不会与父进程共享内存,因此进程间通信需要通过其他的特殊方法完成。为完成进程之间的通信,需要创建管道,管道不属于进程的资源(即不是fork复制的对象),而是和套接字一样,属于操作系统资源,因此通过管道首实现IPC的原理是,两个进程通过操作系统提供的内存进行通信。通过创建两个管道,各自在进程间负责不同的数据流,即可方便的实现进程间双向通信,采用两个管道即可避免程序运行流程的预测或控制。方案1:通过一个管道实现两个进程间的双向通信。...原创 2022-08-18 17:35:24 · 785 阅读 · 0 评论 -
CMAKE学习笔记
CMAKE是一个开源、跨平台的编译、测试和打包工具,它使用比较简单的语言描述编译、安装的过程,输出Makefile或者project文件,再去执行构建。当多人协同开发一个较大的项目时,会产生较多的源代码文,因此需要说明编译的顺序,例如需要先编译什么,再编译什么,这个过程称之为构建(Build),在构建的过程中使用的工具是make,对应的定义构建过程的文件称为Makefile;但是编写Makefile文件的语法较为复杂,尤其是对于大型的复杂项目,编写Makefile的过程则更为困难。3.1介绍/*......原创 2022-07-16 19:01:58 · 2609 阅读 · 0 评论 -
TCI/IP网络编程(7) 多播与广播
应用场景:假设服务端需要同时向10000个客户端发送同样的通知消息,如果利用TCP,需要维护10000个套接字连接,如果是基于UDP,也需要进行10000数据传输,向大量客户端发送相同的数据,会对服务器端和网络流量产生负面的影响。多播方式的数据传输是基于UDP完成的,因此其与UDP客户端/服务端的实现方式,区别在于,UDP传输以单一目标地址进行,而多播模式下,数据会同时传递到所有加入注册组的的主机,即采用多播方式的时候,可以同时向多个主机传输相同的数据。多播的数据传输特点:多播组是D类IP地址(244.0原创 2022-07-10 17:08:38 · 1219 阅读 · 0 评论 -
TCP/IP网络编程(6)
1. IO复用并发服务器的实现方法在网络程序中,数据通信时间比CPU运算时间占比更大,因此,采用并发的形式向多个客户端提供服务是一种有效利用CPU的方式。并发服务器的主要实现模型及方法如下所示:多进程服务器,通过常见多个进程提供服务 多路复用服务器,通过捆绑并统一管理IO对象提供服务 多线程服务器,通过生成与客户端等量的线程提供服务基于IO复用的服务器端:复用的概念:在一个通信频道中传输多个数据(信号)的技术。典型的例子:通信领域时分复用技术以及频分复用技术,在同一条通信线路上,分时传原创 2022-07-09 12:02:02 · 350 阅读 · 0 评论 -
TCP/IP网络编程(5)
1. 套接字可选项除了使用套接字的默认参数外,还可自定义设置套接字的多种参数:套接字的参数 协议层 选项名 读取 设置 SOL_SOCKET SO_SNDBUF O SO_RCVBUF O IPPROTO_IP .原创 2022-05-21 11:22:19 · 781 阅读 · 0 评论 -
TCP/IP网络编程(4)
TCP套接字的半关闭TCP的断开过程比建立连接的过程更加的重要,一般在建立连接的过程中不会出现大的问题,但是在断开连接的过程中,可能发生预想不到的情况。Linux中的close函数和windows下的closesocket函数意味着完全断开连接,既不能传输数据,也不能接收数据,因此在某些条件下,直接调用这两个函数显得不够优雅。如下图所示:假设主机A与主机B在进行通讯,主机A发送完最后的数据,调用close函数断开连接,之后主机A再无法收到数据B传输的数据,因此,由主机B传输的,主机A必须接收原创 2022-04-26 21:49:41 · 585 阅读 · 0 评论 -
TCP/IP网络编程(3)
基于DUP的服务端与客户端在TCP/IP网络编程(2)中,介绍了TCP/IP的四层模型,传输层分为TCP和UDP两种方式,通过TCP套接字完成数据交换已经进行了介绍,下面介绍通过UDP套接字完成数据交换。UDP套接字的特点UDP的通信原理类似于寄送信件,在寄信之前,需要在信封上写好寄信人信息和收信人的地址信息,之后贴上邮票放进信箱即可。但是信件传输的特点,使我们无法确认收信方是否成功收到了信件,以及寄信过程总,信件是否发生了丢失或者损坏,即这是一种不可靠的通信方式。与之类似,UDP同样提供的是一原创 2022-04-05 20:47:56 · 2342 阅读 · 0 评论 -
TCP/IP网络编程(2)
地址族与数据序列IP(Internet Protocol)是为了收发网络数据而分配给计算机的值。端口号是为了区分程序中创建的套接字而分配的序号。目前IP地址分为两类,IPV4(四字节地址族 ), IPV6(16字节地址族)。目前以IPV4地址为例,4字节IP地址分为网络地址和主机地址,且分为A,B, C, D, E类地址。...原创 2022-03-27 16:04:33 · 3579 阅读 · 0 评论 -
C++多线程编程(2) 条件变量与原子操作
条件变量条件变量是c++11 提供的另一种用于等待的同步机制,它能阻塞一个或者多个线程,直到收到另外一个线程发出的通知或者超时,才会唤醒当前阻塞的线程,条件变量需要和互斥量配合使用,C++11提供两种互斥变量:1. condition_variable: 需要配合std::unique_lock<std::mutex>进行wait操作2.condition_variabl...原创 2019-08-09 15:45:33 · 1147 阅读 · 0 评论 -
C++11 处理时间和日期的处理,以及chrono库介绍
C++11提供了日期和时间相关的库chrono,通过这个库可以很方便的对时间和日期进行处理:chrono库主要包含三种类型:1.时间间隔duration介绍一下duraton的原型:template<class Rep, class Period=std::ratio<1, 1>>class duration;Rep表示时钟数的类型,Period表示时...原创 2019-08-09 12:11:50 · 2135 阅读 · 0 评论 -
C++知识整理 内存模型和命名空间
在读《C++ primer》的过程中整理一下知识点,做点笔记。单独编译:C++鼓励将组件函数放到独立的文件中,然后可以单独编译这些文件,将他们链接成可执行程序。在大型项目中,如果只改变了一个文件,则可以对这个文件进行单独编译,然后将它与其他文件的编译版本链接即可。.h文件和.cpp文件中应该存放的内容:1. 头文件 XXX.h文件:a. 包含结构声明和使用这些结构的函数原型b...原创 2019-08-02 11:10:52 · 274 阅读 · 0 评论 -
C++多线程编程 (1)
对于单处理器系统,处理器在一个单元时间内只能执行一个进程,操作系统系统以极快的速度在多个进程之间进行切换,营造了一种多个进程同时运行的假象。1. 一些基本概念:c++中的静态库与动态库:1. 静态库:*.lib 是指一些已经编译过的代码,在程序运行之前,静态库在编译的时候被放入到可执行文件中。 静态库在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包...原创 2019-08-05 16:54:15 · 4307 阅读 · 0 评论 -
C++ 知识整理 函数
在读《c++primer》的过程中,遇到一些知识点,做一下简单的备忘c++中函数接受的参数是引用类型的情况下,传递引用的限制非常的严格:举个例子:例如,定义函数swap(),实现两个数字值的交换:#include <iostream>#include <cstddef> // inlude ptrdiff_t#include <vector...原创 2019-07-14 10:28:40 · 268 阅读 · 0 评论 -
C++ STL基本概念 学习笔记
组成1.容器(containers)2.算法 (algorithms)3.迭代器 (iterators)4.仿函数 (functors)5.配接器 (adapters)6.空间配置器 (allocators)1. 容器序列式容器:元素的可序(ordered), 有序(sorted)关联式容器:array: 大小固定的序列容器,保存了一个以严格的线性顺序...原创 2019-06-17 15:29:48 · 339 阅读 · 1 评论 -
C++数据结构与算法 动态规划
动态规划: 和贪婪算法一样,动态规划对一个问题的解是一系列的决策过程,贪婪算法依据贪婪准则,做出的每一个抉择都是不可撤回的,在动态规划中,需要考察一系列抉择,已确定一个最优抉择序列是否包含一个最优抉择子序列。例如,在上图中,要从节点1到达节点5,选择一条最短的路径,第一步可以选择的顶点为2,3,4。假设选择顶点3, 然后决定如何从顶点3到达顶点5。如果选择了一条从顶点3到顶...原创 2019-06-17 10:58:50 · 341 阅读 · 0 评论 -
C++STL学习笔记(4) 分配器(Allocator)
在前面的博客《C++ STL学习笔记(3) 分配器Allocator,OOP, GP简单介绍》中,简单的介绍了分配器再STL的容器中所担当的角色,这一节对STL六大部件之一的分配器进行详细的学习,从STL源代码的角度去理解分配器的具体细节:operator new 和malloc在不同的平台上调用C++中的operator new,最终都会是去调用malloc去分配内存,而malloc又会...原创 2019-08-24 20:09:38 · 2196 阅读 · 0 评论 -
c++ 函数指针
函数指针基础:1. 获取函数的地址2. 声明一个函数指针3.使用函数指针来调用函数获取函数指针:函数的地址就是函数名,要将函数作为参数进行传递,必须传递函数名。声明函数指针声明指针时,必须指定指针指向的数据类型,同样,声明指向函数的指针时,必须指定指针指向的函数类型,这意味着声明应当指定函数的返回类型以及函数的参数列表。例如:double cal(int); ...原创 2019-06-15 21:41:38 · 93257 阅读 · 12 评论 -
C++ 智能指针
在之前的一篇博客《c++智能指针用法》中简单介绍过智能指针与Java等具有垃圾回收机制的语言相比,C++语言没有垃圾回收机制,必须自己去释放分配的内存,否则就会存在内存泄露的问题。而解决查找内存泄漏需要花费大量的时间和精力,最有效的解决办法就是使用智能指针(Smart Pointer)。智能指针能够自动删除分配的内存,它与普通指针的是使用方法类似,但是不需要手动释放。它会自己管理内存的释放,这...原创 2019-08-14 14:35:39 · 324 阅读 · 0 评论 -
C++多线程编程(3) 异步操作类 std::future std::promise std::async
C++中提供了异步操作相关的类:1. std::future: 异步结果的传输通道,可以很方便的获取线程函数的返回值。 在C++中,如果希望获取线程函数的返回值,就不能直接通过thread.join()得到结果,这时就必须定义一个变量,在线程函数中去给这个变量赋值,然后执行join,最后得到结果,这是一个非常繁琐的过程。C++11 的 thread 库提供了future,用来访问异步操作...原创 2019-08-10 15:03:14 · 1036 阅读 · 1 评论 -
C++11 随机数生成
C++ 程序中,在新标准出现之前,C 和 C++ 都依赖一个C 库函数 rand 来产生随机数,然而,这个函数生成的是均匀分布的伪随机数,每个随机数的范围在 0 和一个最大值RAND_MAX(至少为 32767)之间。 rand 函数存在一些问题:在实际的编程中,很多程序需要不通范围的随机数。一些应用需要随机浮点数。一些程序需要非均匀分布的随机数。所在在编写程序时为了生成满足一...原创 2019-08-10 20:02:20 · 1392 阅读 · 1 评论 -
c++课后题(2) 数组排序
2.排序算法:输入: 一个数组1. 冒泡排序2. 选择排序 (每次选择剩余序列中最小的数)#include <iostream>#include <iomanip>using namespace std;const int SIZE_LEN=10;void bulb_sort(int [], int );void select_sort(in...原创 2018-10-23 18:54:37 · 514 阅读 · 0 评论 -
C++ STL学习笔记(5) Vector容器, array容器,deque容器
动态增长的数组vector,当它放入的元素满了的时候,会自动的扩充内存,但是,在计算机中内存不能够实现原地扩充,因为在申请了一块固定大小的内存之后,这块内存不管有没有用完,他后面的内存都有可能别的内容被占用。所以扩充的过程是在内存中别的地方找到一块足够大的内存,把原来的东西搬过去。vector的内部示意图:vector关键部分的实现代码: finish指向的是最后一个元素的后一个位置可...原创 2019-08-29 11:44:00 · 305 阅读 · 0 评论 -
C++11新特性(4)
1. 委托构造函数委托构造函数允许在同一个类中,一个构造函数可以调用另一个构造函数,从而可以在初始化的时候简化变量的初始化。例如:定义一个test类// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。#include "stdafx.h"#include <iostream>#include <type_traits>...原创 2019-08-28 19:35:10 · 359 阅读 · 0 评论 -
C++11新特性(3)
C++11引入了右值引用和移动语义,避免无谓的赋值,提高了程序的性能,同时,C++11引入了不定序容器,例如undored_map,标准库中的map容器插入元素的时候会自动排序,但是在不需要排序的场景下,这种额外的操作会影响程序的性能。而不定序容器在插入元素的时候,在不需要排序的情况下不会浪费额外的性能。1.右值引用:首先介绍什么是左值和右值:左值是指表达式结束后依然存在的持久对象,右...原创 2019-08-22 21:11:26 · 520 阅读 · 0 评论 -
C++11 新特性整理(2)
基于范围的or循环:C++中对于for循环的写法:1. 借助容器的迭代器完成2. <algorithm>中的for_each算法:3. 基于范围的for循环// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。#include "stdafx.h"#include <iostream>#include <memo...原创 2019-08-16 14:28:14 · 195 阅读 · 0 评论 -
C++ STL学习笔记(3) 分配器Allocator,OOP, GP简单介绍
继续学习侯捷老师的课程! 在前面的博客《C++ STL学习笔记(2) 容器结构与分类》中介绍了STL中常用到的容器以及他们的使用方法,在我们使用容器的时候,背后需要一个东西支持对内存的使用,这个东西就是分配器(Allocator)。容器一般都会有一个默认的分配器。例如,以vector为例,可以看到它的定义:他有一个默认的分配器std::alloca...原创 2019-08-12 14:05:11 · 559 阅读 · 0 评论 -
C++11 新特性整理 (1)
C++11对模板细节的改进:1. C++11改善了编译器的解析规则,尽可能地将多个右尖括号(>)解析为模板参数结束符,例如在C++98中:Foo<A<int> > xx; // 两个右尖括号必须有空格,否则会被编译器解析成右移操作符return 0;在C++11中则完全取消了这种限制。2. 模板的别名:typedef可以重定义类型,例如:...原创 2019-08-15 14:33:25 · 257 阅读 · 0 评论 -
C++ STL学习笔记(2) 容器结构与分类
接着学习侯捷老师的C++ STL!在使用容器的时候,需要明白容器中元素之间在内存里的关系是什么样的,是连续的,还是非连续的。容器可以分为两类:1. sequence container , 即序列容器a. Array 连续空间 , 大小固定,不能扩充b. Vector 后部可以扩充(当然扩充工作由Allocator完成),我们只需将元素放进去即可c. Deque 双...原创 2019-08-11 11:12:59 · 394 阅读 · 0 评论 -
c++知识整理 编程模块
最近开始看c++primer,做一点记录!函数的基础知识:要使用函数,必须完成:1. 提供函数的定义2.提供函数原型3.调用函数了解一下,函数是如何返回它的返回值:函数会通过将返回值复制到指定的cpu寄存器或者内存单元中来将其返回,随后,调用程序将查看该内存单元,在这一过程中,返回函数和调用函数必须就该内存中存储的数据的类型达成一致,函数原型将返回值类型告知调用程序,而...原创 2019-06-15 09:49:40 · 720 阅读 · 0 评论 -
c++智能指针用法
本文转自博客:http://www.cnblogs.com/TenosDoIt/p/3456704.html,非常感谢作者! 本文介绍c++里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中后三个是c++11支持,并且第一个已经被c++11弃用。 为什么要使用智能指针:我们知道c++的内存管理是让很多人头疼的...转载 2019-05-23 09:03:49 · 207 阅读 · 0 评论 -
算法设计 分治, 归并排序, 快速排序
算法思想:分治方法与软件设计的模块化方法非常的相似。要解决一个大实例问题,可以(1)将它分解成多个更小的实例,(2)分别解决每个小实例,(3)将小实例的解组合成大实例的解。例子:寻找假硬币。一个袋子有16枚硬币,其中可能有一个假币,并且假币比真币要轻,现在要找出这个假币。现在要找出假硬币,我们把两个或者三个硬币视为不可再分的小实例,只有一个硬币时,不能确定它的真假。2. 金块问...原创 2019-05-20 10:41:21 · 1552 阅读 · 0 评论 -
C++学习笔记(10)运算符重载,友元函数,友元类
c++允许我们为运算符定义专门的函数,这被称为运算符重载:运算符可以简化字符串的操作,‘+’,以及使用关系运算符比较字符串,[ ]运算符访问向量中的元素;例如:#include <iostream>#include <string> #include <vector>using namespace std;int main(){ ...原创 2018-11-29 21:23:33 · 511 阅读 · 0 评论 -
c++学习笔记(12) 需要对对象做拷贝时(深拷贝,浅拷贝),如何重载赋值运算符
在c++学习笔记(8)中,介绍了拷贝构造函数的概念:涉及到深拷贝和浅拷贝的概念:拷贝构造函数:每一个类都有一个都有一个拷贝构造函数,用于拷贝对象。拷贝构造函数可以用来创建一个对象,并用另一个对象的数据初始化新建对象。缺省的拷贝构造函数和赋值运算符(=)进行对象赋值采用的是一种所谓的“浅拷贝”,即如果数据域是一个指向其他对象的指针,那么就会简单复制指针保存的地址值,而不是复制指针指向的对象的内容...原创 2018-12-02 10:32:29 · 266 阅读 · 0 评论 -
C-free在编写代码的过程中遇到方向键失灵,回车键失灵,换行失灵,但是可以正常输入的解决办法!!!!!
本人开始刚开始学c++,通过一番寻找,发现c-free是一款不错的软件,它比visual c++好用,相比visual_studio又小很多(80多M),,对于初学者是不错的选择。安装过visual studio的同学就知道那有多难受,一下将C盘吃掉很多。-----------------------------------------------------------分割线------...原创 2018-11-24 11:17:42 · 1834 阅读 · 0 评论 -
c++笔记(10) 文件输入输出
c++ 定义了ifstream, ofstream, fstream类用于文件处理和操作文件,这些类定义在头文件<fstream>中。c++使用“流”来描述数据流动,数据流向程序,则为input stream(输入流),反之为output stream输出流。1.文本文件的读写操作。写入文件#include <iostream>#include <...原创 2018-11-13 19:22:37 · 786 阅读 · 0 评论 -
C++笔记(9) 模板,向量和栈
函数模板,类模板模板功能提供了在函数和类中将类型作为参数的能力,可以设计具有通用类型的函数和类,而编译器在编译时会将通用类型确定为具体类型。如max()函数:需要比较两个int,double, char, string,需要写四个重载函数C++允许定义具有通用类型的函数模板#include <iostream>#include <iomanip>#in...原创 2018-11-02 10:57:53 · 346 阅读 · 0 评论 -
c++笔记(8) 指针及动态内存管理
指针:指针变量,可以用用来引用数组,对象,任何变量的地址。指针中保存的是地址,用*(解引运算符)来访问内存中的数据指针的使用:#include <iostream>#include <string>#include <iomanip>#include <sstream> // 将数字转化为字符串 using namespace...原创 2018-10-24 12:14:06 · 300 阅读 · 0 评论