- 博客(29)
- 收藏
- 关注
原创 套接字(socket)编程简介
套接字(socket)编程简介现在的网络编程几乎都是用的socket。我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket!那什么是socket?下面介绍一下socket的相关概念和一些基本函数。套接字概念Socket本身有“插座”的意思,在Linux环境下,用于表示进程间网络通信的特殊文件类型。本质为内核借助缓冲区形成的伪文件。既然是文件
2020-11-29 17:43:30
2305
1
原创 Linux中常用的网络命令详细介绍(ifconfig、route、ping、traceroute、netstat)
Linux网络命令ifconfig 许多windows非常熟悉ipconfig命令行工具,它被用来获取网络接口配置信息并对此进行修改。Linux系统拥有一个类似的工具,也就是ifconfig(interfaces config)。通常需要以root身份登录或使用sudo以便在Linux机器上使用ifconfig工具。依赖于ifconfig命令中使用一些选项属性,ifconfig工具不仅可以被用来简单地获取网络接口配置信息,还可以修改这些配置。命令格式ifconfig [网
2020-11-22 17:49:47
3667
原创 网络地址
网络地址物理地址每块网卡都拥有唯一的ID号,也叫做MAC地址(48位),如00-aa-00-62-c9-09。MAC地址被烧录在网卡上的ROM中,就像我们每个人的遗传基因DNA一样,即使在全世界也绝不会重复。逻辑地址IP地址是一个32位二进制数,用于标识网络中的一台计算机,如127.0.0.1,192.168.1.200IP地址通常以两种方式表示:二进制数和十进制数。二进制数表示:在计算机内部,IP地址用32位二进制数表示,每8位为一段,共4段。如10000011.011010
2020-11-08 17:12:28
1649
原创 计算机网络体系结构
计算机网络体系结构网络通信协议从应用的角度出发,协议可理解为“规则”,是数据传输和数据的解释的规则。假设,A、B双方欲传输文件。规定:第一次,传输文件名,接收方接收到文件名,应答OK给传输方;第二次,发送文件的尺寸,接收方接收到该数据再次应答一个OK;第三次,传输文件内容。同样,接收方接收数据完成后应答OK表示文件内容接收成功。由此,无论A、B之间传递何种文件,都是通过三次数据传输来完成。A、B之间形成了一个最简单的数据传输规则。双方都按此规则发送、接收数据。A、B之间达成的这个相互遵
2020-11-01 12:40:59
1506
6
原创 C和C++的强制类型转换
C++ 四种强制类型转换一般来说,我们需要类型转换的场景可以分为如下几种:整型和浮点型以及不同长度的数据相互转换一般规则是:占用内存低的向占用内存高的自动转换,而反向则会有转换截断的问题整型和指针相互转换当我们试图根据某个成员变量的偏移位计算其在该对象内存空间位置时,就会需要将指针转换为整型进行计算。当计算出该变量的位置后(整型),就需要将其转换为指针类型。整型和枚举类型相互转换。这种转换往往发生在数学计算的场景下。因为枚举一般只是用于表意,而实际参与运算的还是整型数据。指针
2020-10-18 16:29:51
3756
2
原创 C++11 智能指针(unique_ptr、shared_ptr、weak_ptr)
很多人怕写 C/C++ 程序就是因为指针,因为指针给了程序员高度的自由,同样也赋予了高度的责任,稍有不慎就导致内存泄漏。其实写 C++ 可以完全不用指针,尤其 C++ 11 对智能指针作了进一步的升级,在不需要使用任何裸指针的前提下也可以写出高效的 C++ 程序。C++ 11 中定义了unique_ptr、shared_ptr与weak_ptr三种智能指针 (smart pointer),都包含在<memory>头文件中。智能指针可以对动态分配的资源进行管理,保证任何情况下,已构造的对象最终会销
2020-10-10 21:37:54
443
转载 C++右值引用与转移语义
右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Sementics) 和精确传递 (Perfect Forwarding)。它的主要目的有两个方面:消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率。能够更简洁明确地定义泛型函数。左值与右值的定义C++(包括 C) 中所有的表达式和变量要么是左值,要么是右值。通俗的左值的定义就是非临时对象,那些可以在多条语句中使用的对象。
2020-10-10 21:27:18
325
原创 二叉树的非递归遍历
二叉树的非递归遍历二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 三种遍历方式访问节点的顺序是一致的,不同之处在于,有的遍历流程把访问到的节点暂存起来,达成某种条件后再将节点输出。
2020-09-27 16:25:05
12140
原创 双指针定义栈结构
双指针定义栈结构通常栈的结构定义是这样:typedef int ElemType;typedef struct{ ElemType data[MAXSIZE]; int top; // 用于标注栈顶的位置 int stackSize;}用 top 变量来指示栈顶元素在数组中的位置,stackSize表示栈的最大容量,栈顶位置top必须小于stackSize。当栈存在一个元素时,top = 0, 空栈时,top = -1。双指针法:typedef int
2020-09-20 17:22:07
711
1
原创 数据结构之线性表
线性表线性表(List)的定义:由零个或多个数据元素组成的有限序列。数学语言来进行定义:若将线性表记为(a1,…,ai-1,ai,ai+1,…an),则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素。所以线性表元素的个数n(n>=0)定义为线性表的长度,当n=0时,称为空表。强调几个关键的地方:首先它是一个序列,也就是说元素之间是有个先来后到的,像刚才的小蝌蚪就没有顺序。若元素存在多个,则第一个元素无前驱,而最
2020-09-20 16:19:00
393
原创 复制控制(C++Primer_第13章)
C++复制控制一、复制控制类能控制复制,赋值,撤销该类的对象时的动作,分别通过下面的成员函数:复制构造函数:具有单个形参,该形参是对该类类型的引用(通常用 const 修饰);赋值操作符析构函数:不管有没显示定义,编译器都自动执行类中非 static 数据成员的析构函数这三个函数就成为复制控制。二.为什么要研究复制控制如果没有显示地定义复制构造函数和赋值操作符,编译器会为我们定义。但是编译器合成的复制控制函数只做必需的工作,某些类如果依赖于默认的定义会导致错误,例如类具有指
2020-09-08 10:46:50
200
原创 C++ 中static的用法
不管是 C,C++,它们中都包含 static。当然这其中的用法及作用也是不一样的。下面主要介绍 static 在 C++ 中的用法:要理解 static,就必须要先理解另一个与之相对的关键字,很多人可能都还不知道有这个关键字,那就是 auto,其实我们通常声明的不用 static 修饰的变量,都是 auto 的,因为它是默认的,就象 short 和 long 总是默认为 int 一样;我们通常声明一个变量:int a; string s; 其实就是:auto int a; auto s
2020-08-29 23:08:06
4682
原创 PTA-习题4-7 最大公约数和最小公倍数
本题要求两个给定正整数的最大公约数和最小公倍数。输入格式:输入在一行中给出两个正整数M和N(≤1000)。输出格式:在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。输入样例:511 292输出样例:73 2044分析:用辗转相除法求最大公约数,511-292=219,292-219=73,219-73=146,146-73=73,当差和减数相等时说明找到511和219的最大公约数,为73。这个功能函数用一个while循环就好了。如何求最小公倍数呢?可以发
2020-08-24 17:23:14
2712
原创 内存空间相关的库函数(memset memcpy memmove memcmp memchr)
这些函数包含在<string.h>头文件中memset–使用一个常量字节填充内存空间使用常量字节 c 填充 s 指向的前 n 个字节。memset 函数按照字符数组的方式操作内存对象,其主要目的是提供一个高效的函数接口,通常用于初始化 malloc 函数申请的内存对象。函数原型:void *memset(void *s, int c, size_t n);s–指向要操作的内存空间; c–指定要填充的值; n-- 指定要填充 s 指向空间的前 n 个字节返回s指向的内存空间示例:
2020-08-24 15:05:37
344
原创 从编译器的角度理解内联函数
1.内联函数定义:GCC中的inline函数可以相当于在一个普通的全局函数加上inline属性。inline关键字仅仅是建议编译器在编译的时候做内联展开处理,而不是强制在gcc编译器中,如果吧编译选项设置为负无穷,即使是inline函数也不会被内联展开,除非设置了强制内联展开的属性(attribute((always_inline)))。关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用普通函数调用:系统首先要跳跃到该函数的入口地址,执行
2020-08-24 12:40:02
1937
原创 C语言输入字符和字符串
在C语言中,有多个函数可以从键盘获得用户输入:scanf():和 printf() 类似,scanf() 可以输入多种类型的数据。getchar()、getche()、getch():这三个函数都用于输入单个字符。gets():获取一行数据,并作为字符串处理。scanf()函数输入利用格式控制符来输入字符和字符串,单个字符—%c,字符串—%s#include <stdio.h>int main(){ char letter; char url[30];
2020-08-21 15:19:35
40055
2
原创 静态库 && 动态库
静态链接&&动态链接学习编程,要对编译链接过程了然如胸。在链接阶段,有两种链接方式——静态链接和动态链接。两者最大的区别在于链接的时机不一样,静态链接是在形成可执行程序前,而动态链接的进行则是在程序执行时,下面来详细介绍这两种链接方式。一、静态链接使用静态链接的原因 在我们的实际开发中,不可能将所有代码放在一个源文件中,所以会出现多个源文件,而且多个源文件之间不是独立的,而会存在多种依赖关系,如一个源文件可能要调用另一个源文件中定义的函数,但是每个源文件都是独立编译的,即
2020-07-31 17:04:08
178
原创 位运算经典应用
位运算经典应用判断奇偶数//一般写法,虽然编译器会自动优化成位运算if(( n%2 ) == 1){ //n是个奇数}//如果把 n 以二进制的形式展示的话,其实我们只需要判断最后一个二进制位是 1 还是 0 就行了,如果是 1 的话,代表是奇数,如果是 0 则代表是偶数if(n & 1 == 1){ //n是个奇数}交换两个数//传统代码int temp = x;x = y;y = temp;//位运算,不需要额外的辅助变量x = x ^ y; //
2020-07-27 16:51:18
270
原创 字符指针和字符数组、多维指针和多维数组
指针的概念以及一维指针和一维数组相关的知识,我这里就不具体讲了,本文主要讲解字符指针和字符数组、多级指针和多级数组这些比较容易混淆的知识点。指针运算赋值运算指针变量可以互相赋值,也可以赋值某个变量的地址,或者赋值一个具体的地址int *px, *py, *pz, x = 10;//赋予某个变量的地址px = &x;//相互赋值py = px;//赋值具体的地址pz = 0x4000;加减运算指针变量的自增自减运算。指针加 1 或减 1 运算,表示指针向前或向
2020-07-17 17:18:55
394
原创 变量的作用域和生命周期及内存管理
变量的作用域和生命周期作用域和生命周期,它们从两个不同的维度描述了一个变量–时间和空间。顾名思义,作用域就是一个变量可以被引用的范围,如:全局作用域、文件作用域、局部作用域;而生命周期就是这个变量可以被引用的时间段。不同生命周期的变量,在程序内存中的分布位置是不一样的。一个程序的内存分为代码区、全局数据区、堆区、栈区,不同的内存区域,对应不同的生命周期。普通局部变量作用域:局部作用域(只在局部作用域中可见)生命周期:程序运行出局部作用域即被销毁内存分布:栈区属于某个{},在{}外部不能使用此
2020-07-14 23:33:33
588
原创 C++ Primer笔记第九章之顺序容器
顺序容器顺序容器(sequential container) 为程序员提供了控制元素存储和访问顺序的能力。这种顺序不依赖于元素的值,而是与元素加入容器时的位置相对应。顺序容器类型:除了固定大小的 array 外,其他容器都提供高效、灵活的内存管理。例如, **string 和 vector 将元素保存在连续的内存空间中。**由于元素是连续存储的,由元素的下标来计算其地址是非常快速的。但是,在这两种容器的中间位置添加或删除元素就会非常耗时:在一次插入或删除操作后,需要移动插入/删除位置之后的所有
2020-07-06 11:48:15
332
原创 C++ primer 学习笔记(第八章)
标准IO库C++使用标准库类处理输入和输出:iostream类处理面向流的输入和输出fstream类处理已命名文件的IOstringstream类处理内存中字符串的IO所有这些类都是通过继承相互关联的。输入类继承了istream,输出类继承了ostream。因此,可在istream对象上执行的操作同样适用于ifstream或istringstream对象。而继承ostream的输出类也是类似的。所有IO对象都有一组条件状态,用来指示是否可以通过该对象进行IO操作。如果出现了错误(例如遇到文件
2020-07-04 16:56:32
338
原创 C++Primer 笔记(第七章)
函数函数可以看作程序员定义的操作。与内置操作符类似,每个函数都会实现一系列的计算,然后生成一个计算结果,不同的是,函数有自己的函数名,而且操作数的个数没有限制。函数的定义形式:返回类型 函数名([形参列表])函数调用做了两件事:用对应的实参初始化函数的形参,并将控制权转移给被调函数。函数体是一个作用域函数体内定义的变量只在该函数中才可以访问,即局部变量形参与实参调用函数时,所传递的实参个数必须与函数的形参个数完全相同;个数相同实参必须具有与形参类型相同、或者能隐式转换为形参类
2020-07-03 23:01:05
132
原创 C++primer笔记 第六章
语句简单语句空语句只有单独一个分号,常用于在循环条件判断部分就能完成全部循环工作的情况;while (cin >> s && s != sought) ; //空语句//循环条件从标准输入中读入一个值并检验cin的读入是否成功;若成功,接着检查该值是否等于sought;找到需要的值,退出循环,否则继续从cin里面读取数据无关的空语句并非总是无害的,非法的分号往往只不过是一个空语句而已;while (iter != svec.end()) ; //
2020-07-02 16:07:06
182
原创 C++ primer 笔记 第五章
表达式表达式 = 操作数 + 操作符表达式的结果一般为右值,可以读取该结果值,但是不允许对它进行赋值;对于操作数为内置或复合类型的二元操作符,通常要求它的两个操作数具有相同的数据类型,或者其类型可以转换为同一种数据类型,比如int型可以转换为double类型;算数操作符左结合关系逻辑操作符逻辑与和逻辑或操作符总是先计算其左操作数,然后再计算其右操作数。只有在仅靠左操作数的值无法确定该逻辑表达式的结果时,才会求解其右操作数。称为“短路求值”;不能串接使用关系操作符;位操作符对于
2020-07-01 16:50:58
316
原创 c++ Primer 笔记(第四章)
数组和指针类似于vector和迭代器类型的低级复合类型。区别在于,数组的长度是固定的。数组一经创建,就不允许添加新的元素。指针则可以像迭代器一样用于遍历和检查数组中的元素。现代C++程序应尽量使用vector和迭代器类型,而避免使用低级的数组和指针。设计良好的程序只有在强调速度时才在类实现的内部使用数组和指针。数组数组的定义和初始化数组定义中的数据类型可以是内置数据类型或类型类型;除引用之外,数组元素的类型还可以是任意的复合类型。没有所有元素都是引用的数组。数组的维数必须用值大于等于1的
2020-06-30 21:31:53
223
原创 MQTT
MQTT **MQTT(消息队列遥测传输)**是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件 。 MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星
2020-06-29 21:11:03
230
原创 C++ Primer学习笔记(第三章)
using 声明在编译实例程序之前,一定注意在程序中添加适当的#include和using 声明标准库string 类型初始化方式:string s1; //默认构造函数,s1为空串string s2(s1); //将s2初始化为s1的一个副本string s3("value"); //将s3初始化为一个字符串字面值副本string s4(n,'c'); //将s4初始化为字符'c'的那个副本string 类型的输入操作符: 读取并忽略.
2020-06-29 12:04:26
114
原创 C++Primer 笔记(第二章)
术语:什么是对象?对象是内存中具有类型的区域。我们可以自由地使用对象描述程序中可操作的大部分数据,而不管这些数据是内置类型还是类类型,是有名字的还是没名字的,是可读的还是可写的。初始化括号-直接初始化;等号-赋值初始化初始化指创建变量并给它赋初值,而赋值则是擦除对象的当前值并用新值代替,直接初始化语法更灵活且效率更高内置类型变量的初始化:函数体外定义-自动初始化成0,函数体内定义-不进行自动初始化类类型变量的初始化:类通过定义一个或多个构造函数来控制类对象的初始化声明和定义可以通.
2020-06-28 17:15:10
128
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人