![](https://img-blog.csdnimg.cn/11393eabae2b443283f5ca4c624afa33.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++服务器开发
文章平均质量分 83
服务器开发中基础且重要的技术栈
_索伦
坚持到最后的普通人
展开
-
负载均衡:理论算法、一致性哈希、常用组件(待补充。。。)
互联网服务的后端使用集群来实现海量的服务请求,为了让集群中的节点均匀的处理服务请求,要用到负载均衡技术。如果做到负载均衡,就达到了控制系统流量的目的。除了保证服务流量的合理分配,还能控制流量走向。原创 2022-09-15 23:59:19 · 241 阅读 · 0 评论 -
网络编程:select的用法和原理
1)在socket内核中,接收缓冲区中的字节数大于或等于低水位标记SO_RCVLOWAT,此时调用recv或read函数可以无阻塞地读取内核文件描述符,并且返回值大于0。1) nfds:Linux上的socket也叫fd,将这个参数的值设置未所有需要使用socket函数检测事件的fd中的最大值加1.5) timeout:超时时间,即在这个参数设定的事件内检测这些fd的事件,超过这个时间后,select函数将立即返回。3) writefds:需要监听的可写事件的fd集合。原创 2022-09-12 22:36:32 · 1429 阅读 · 1 评论 -
网络编程:发送0字节数据的效果
网络编程:发送0字节数据的效果。原创 2022-08-29 22:40:15 · 679 阅读 · 1 评论 -
网络编程:socket的阻塞模式和非阻塞模式
返回值n返回值含义大于0成功发送(send)或接收(recv)n字节0对端关闭连接小于0(-1)出错、信号被中断、对端TCP窗口太小导致数据发送不出去或当前网卡缓冲区已无数据可接收返回值大于0。在这种情形下,一定要判断send函数的返回值是不是我们期望发送的字节数,而不是简单的判断其返回值大于0.\n");}虽然返回值n大于0,但在实际情况下,由于对端的TCP可能因为缺少一部分字节就满了,所以n的值可能为(0, buf_length]。...原创 2022-08-28 20:17:52 · 10630 阅读 · 1 评论 -
Linux线程同步对象:互斥体、信号量、条件变量、读写锁
因为某次操作系统唤醒pthread_cond_wait()时tasks.empty()可能仍为true,即操作系统可能在某些情况下唤醒条件变量,也就是说存在没有其他线程向条件变量发送信号,但等待此条件变量的线程有可能醒来的情形。信号量代表一定的资源数量,可以根据当前资源的数量按需唤醒指定数量的资源消费者线程,资源消费者线程一旦获取信号量,就会让资源减少指定的数量,如果减少为0,则消费者线程将全部处于挂起状态;broadcast唤醒所有调用pthread_cond_wait()等待的线程,相当于广播。....原创 2022-08-10 23:09:12 · 410 阅读 · 0 评论 -
典型的一次IO的两个阶段是什么?阻塞、非阻塞、同步、异步
而异步,是把sockfd,buf和一个信号或回调的通知方式告知内核,内核将数据拷贝到buf,这个过程应用程序不参与,可以去做其他事情,拷贝完成后,内核根据这个通知方式告知应用程序,这个操作就是异步。如果数据就绪,开始进行读写,应用程序这边的recv会花自己的时间,从内核缓冲区中读数据,拷贝到recv的buf里,这个过程应用程序是一直等待拷贝完成的,完不成就一直阻塞在那个位置,所以是同步操作。A操作告诉B操作它感兴趣的事件以及通知方式,A操作继续执行自己的业务逻辑了;典型的一次IO的两个阶段是什么?.....原创 2022-08-01 17:21:21 · 501 阅读 · 0 评论 -
集群聊天服务器:项目问题汇总
在编写代码时在客户端和服务器生成公钥和私钥,然后客户端和服务器三次握手建立连接后,客户端利用RSA公钥把对称加密的AES密钥加密成密文,发送到服务器后服务器利用RSA私钥解密,得到这个AES私钥,然后给客户端回复一个OK,客户端和服务器就都拥有了AES私钥,那么在后续的数据传输中,就可以利用AES对称加密来对明文加密了。接收方维护每个好友的消息seq,初始化为0,当接收到消息时,查看该消息的seq,如果不是0,则对当前消息进行缓存,等到序列号为0的消息接收到后,对维护好友的seq++,再去查看缓存的消息。.原创 2022-07-24 11:16:05 · 1087 阅读 · 0 评论 -
集群聊天服务器:集群与分布式理论
在聊天服务器项目中实现了集群,在这里根据该项目来讲解一下单机、集群与分布式理论。原创 2022-07-23 20:01:21 · 591 阅读 · 0 评论 -
C++必知必会:final、override关键字和=default、=delete语法
final、override、=default、=delete是C++11新增的一组非常具有标记意义的关键字和语法。该关键字修饰一个类,这个类不允许被继承,这在其他语言中早就实现了。在C++11中,final关键字要写在类名的后面。示例:C++语法规定,在父类中加了virtual关键字的方法可以被子类重写,子类重写该方法时可以加或不加virtual关键字,示例:带来的问题:为了解决这两个问题,C++引入了override关键字。类方法被override关键字修饰,表明该方法重写了基类的同名方法,加了该原创 2022-07-11 17:36:57 · 1246 阅读 · 0 评论 -
C++必知必会:C++17注解标签(attributes)
在C++98/03时代,不同的编译器使用不同的注解为代码增加了一些额外的说明,比如常见的#pragma, __declspec, __attribute等。从C++11开始,新的语言标准统一制定了一些常用的注解标签,所以在这里介绍几种常用的。使用注解标签得语法如下:这些标签可以修饰任意类型、函数或者enumeration,在C++17之前不能修饰命名空间和 enumerator,在C++17后这个限制也被取消。enumeration和enumerator,前者是指从C时代就存在的不限定作用域的枚举。示例:原创 2022-07-11 15:37:23 · 3146 阅读 · 1 评论 -
C++必知必会:统一的类成员初始化语法与std::initializer_list<T>
假设类A有一个类型为int数组的成员变量,在C++98/03中,如果要在构造函数中对这个成员变量进行初始化,需要这样写:对于字符数组,可能就需要在构造函数中使用strcpy、memcpy这一类函数了;再者,如果数组元素足够多,初始值又没什么规律,则这种赋值代码会有很多行,如果nums数组是一个局部变量,则我们在定义nums时可以使用如下语法对其进行初始化:C++11初始化列表所以在C++11中,对类成员变量也可以使用这种语法进行初始化成员变量的初始值在Java这类语言中定义一个类时,可以为其成员变原创 2022-07-09 18:31:45 · 398 阅读 · 1 评论 -
C++必知必会:pimpl惯用法
在日常开发中,类的public方法提供了对外接口供第三方使用,每个函数的具体实现都在XXX.cpp里,对第三方不可见。对于Windows系统上提供给第三方的库,库作者一般需要提供.h、.lib、.dll 文件给使用者,对于Linux系统则需要提供.h、.a、或 .so。不管那种系统,提供像XXX.h这样的头文件给第三方使用时, .h文件中类的大量成员变量和私有函数都暴露了这个类的太多实现细节,很容易让使用者看出其实现原理。这个类中暴露了成员变量使用pimpl惯用法之后所有的关键成员变量都已经不存在了,取原创 2022-07-09 15:36:28 · 909 阅读 · 0 评论 -
C++必知必会:RAII惯用法
RAII(Resource Acquisition Is Initialization, 资源获取即初始化)指资源在我们拿到的时候就已经初始化,一旦不需要该资源,就可以自动释放该资源。对于C++来说,资源在构造函数中初始化(可以在构造函数中调用单独的初始化函数),在析构函数中释放或清理。常见的情形就是再函数调用过程中创建C++对象时分配资源,在C++对象出了作用域时将其自动清理和释放。如下代码,heapObj出了作用域该程序就会自动调用析构函数释放堆内存对多线程锁的获取和释放在日常写的代码里,为了避免死原创 2022-07-09 09:47:40 · 320 阅读 · 0 评论