- 博客(52)
- 收藏
- 关注
原创 redis错误:MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist o
redis错误:MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (st
2022-09-22 22:26:39 1556
原创 C++11动态内存
如果在一个条件判断中使用智能指针,效果就是检测它是否为空。shared_ptr 和 unique_ptr都支持的操作shared_ptr spunique_ptrspp->mem 等价于(*p).memp.get() 返回p中保存的指针。注意如果智能指针释放了其对象,返回的指针所指向的对象也消失了swap(p,q) 交换p和q的指针p.swap(q)shared_ptr独有的操作make_shared(args) 返回一个shared_ptr,指向.
2022-05-04 18:00:50 903
原创 基于muduo,mysql,redis,nginx的集群聊天服务器
集成聊天服务器项目介绍项目名称:集成聊天服务器平台工具:vs code ,linux shell命令行,cmake编程语言:C++项目内容:网络层基于muduo网络库的reactor模型,one loop per thread,使用方便;使用优秀的第三方库json,用以实现数据的序列化和反序列化,进行数据传输;数据库选择了关系型数据库MySQL;负载均衡器方面,选择了nginx的tcp负载均衡模块;实现多台服务器之间的通信功能,选择使用redis的订阅
2022-03-10 15:19:38 4532
原创 muduo库
前言这个假期跟着教学视频手写了muduo库,该muduo库是经过改造,不依赖boost库,用C++11重构。手写muduo库的过程虽然有些枯燥,但学会的东西确实也很多。因为本人基础较差,因此代码几乎全是照抄老师,若涉及侵权请提醒在下删除。下面附上代码,以及我在写完全部代码后对整个muduo库的调用过程的部分理解,感兴趣的朋友可以看看。muduo网络库核心代码模块Channel其内部成员主要有fd,events(fd感兴趣的事件),loop(用以管理channel和poller,也是channel
2022-02-17 00:49:55 1036 2
原创 muduo库 Timestamp
#pragma once#include<string>#include<iostream>class Timestamp{public: Timestamp(); explicit Timestamp(int64_t microSecondsSinceEpoch); static Timestamp now(); std::string toString() const;private: int64_t microSeconds
2022-02-17 00:29:46 479
原创 muduo库 Thread
#pragma once#include "noncopyable.h"#include <functional>#include <thread>#include <memory>#include <unistd.h>#include <string>#include <atomic>class Thread : noncopyable{public: using ThreadFunc = std::
2022-02-17 00:28:59 471
原创 muduo库 testserver测试代码
#include <mymuduo/TcpServer.h>#include <mymuduo/Logger.h>#include <string>#include <functional>class EchoServer{public: EchoServer(EventLoop *loop, const InetAddress &addr, const std::string
2022-02-17 00:28:27 189
原创 muduo库 TcpServer
#pragma once/** * 用户使用muduo编写服务器程序 */ #include "EventLoop.h"#include "Acceptor.h"#include "InetAddress.h"#include "noncopyable.h"#include "EventLoopThreadPool.h"#include "Callbacks.h"#include "TcpConnection.h"#include "Buffer.h"#include <f
2022-02-17 00:27:45 96
原创 muduo库 TcpServer
#pragma once/** * 用户使用muduo编写服务器程序 */ #include "EventLoop.h"#include "Acceptor.h"#include "InetAddress.h"#include "noncopyable.h"#include "EventLoopThreadPool.h"#include "Callbacks.h"#include "TcpConnection.h"#include "Buffer.h"#include <f
2022-02-17 00:26:18 447
原创 muduo库 TcpConnection
#pragma once#include"Callbacks.h"#include"noncopyable.h"#include"InetAddress.h"#include"Buffer.h"#include"Timestamp.h"#include<memory>#include<atomic>#include<string>class EventLoop;class Socket;class Channel;/** TcpSer
2022-02-17 00:23:49 287
原创 muduo库 Socket
#pragma once#include"noncopyable.h"#include"InetAddress.h"class Socket:noncopyable{public: explicit Socket(int sockfd) : sockfd_(sockfd) {} ~Socket(); int fd()const { return sockfd_; } void bindAddress(const InetAddress &am
2022-02-17 00:23:00 209
原创 muduo库 Poller
#pragma once#include"noncopyable.h"#include"Timestamp.h"#include<vector>#include<unordered_map>class Channel;class EventLoop;class Poller:noncopyable{public: using ChannelList=std::vector<Channel*>; Poller(EventLoop
2022-02-16 23:52:46 159
原创 muduo库 noncopyable
#pragma once/** * noncopyable被继承以后,派生类对象可以正常的构造和析构,但是派生类对象 * 无法进行拷贝构造和赋值操作 */ class noncopyable{public: noncopyable(const noncopyable&) = delete; noncopyable& operator=(const noncopyable&) = delete;protected: noncopyable()
2022-02-16 23:52:15 232
原创 muduo库 Logger
#pragma once#include<string>#include"noncopyable.h"//宏为多行时,每行后面先空格再加\再回车//LOG_INFO("%s %d",arg1,arg2)#define LOG_INFO(logmsgFormat, ...) \ do \ { \ Logger &logger = Logger::instance(); \ logger.setLogLevel(INFO);
2022-02-16 23:51:44 270
原创 muduo库 InetAddress
#pragma once#include<arpa/inet.h>#include<netinet/in.h>#include<string>//设置 sockaddr_in(内含IP,端口等)class InetAddress{public: explicit InetAddress(uint16_t port=0,std::string ip = "127.0.0.1"); explicit InetAddress(const
2022-02-16 23:51:14 263
原创 muduo库 EventLoopThreadPool
#pragma once#include"noncopyable.h"#include<string>#include<memory>#include<vector>#include<functional>class EventLoopThread;class EventLoop;class EventLoopThreadPool:noncopyable{public: using ThreadInitCallback =
2022-02-15 14:41:22 235
原创 muduo库 EventLoopThread
#pragma once#include"noncopyable.h"#include"Thread.h"#include<functional>#include<mutex>#include<condition_variable>//条件变量头文件#include<string>class EventLoop;// one loop per threadclass EventLoopThread:noncopyable{publ
2022-02-15 14:40:48 213
原创 muduo库 EventLoop
#pragma once#include"Timestamp.h"#include"noncopyable.h"#include"CurrentThread.h"#include<functional>#include<vector>#include<atomic>#include<memory>#include<mutex>class Channel;class Poller;//时间循环类 主要包含了两大模块 C
2022-02-15 14:40:15 262
原创 muduo库 EPollPoller
#pragma once#include "Poller.h"#include "Timestamp.h"#include <vector>#include <sys/epoll.h>class Channel;/** * epoll的使用 * epoll_create * epoll_ctl add/mod/del * epoll_wait */ class EPollPoller : public Poller{public:
2022-02-15 14:39:41 155
原创 muduo库 DefaultPoller
#include "Poller.h"#include "EPollPoller.h"#include <stdlib.h>Poller* Poller::newDefaultPoller(EventLoop *loop){ if (::getenv("MUDUO_USE_POLL")) { return nullptr; // 生成poll的实例 } else { return new EPollPoller(
2022-02-15 14:39:12 132
原创 muduo库 CurrenThread
#pragma once#include <unistd.h>#include <sys/syscall.h>namespace CurrentThread{ extern __thread int t_cachedTid; void cacheTid(); inline int tid() { if (__builtin_expect(t_cachedTid == 0, 0)) {
2022-02-15 14:38:38 267
原创 muduo库 Channel
#pragma once#include "noncopyable.h"#include "Timestamp.h"#include <functional>#include <memory>class EventLoop;/** * 理清楚 EventLoop、Channel、Poller之间的关系 《= Reactor模型上对应 Demultiplex * Channel 理解为通道,封装了sockfd和其感兴趣的event,如EPOLLIN、EPO
2022-02-15 14:38:07 231
原创 muduo库 Callbacks
#pragma once#include <memory>#include <functional>class Buffer;class TcpConnection;class Timestamp;using TcpConnectionPtr = std::shared_ptr<TcpConnection>;using ConnectionCallback = std::function<void (const TcpConnectionPtr&
2022-02-15 14:37:36 158
原创 muduo库 Buffer
#pragma once#include<vector>#include<string> /* * 我们在使用buffer时,其内部可能存有可读数据,这是给我们的服务器所读取的,readerIndex_记录的就是这些数据的起始位置。 * 但是并没有所谓的可写数据(不要误以为有),有的只是buffer中剩余空间的大小,即可供我们服务器写数据的缓冲区大小,因此当buffer未满时, * buffer_.size()-writeIndex
2022-02-15 14:31:51 423
原创 muduo库 Acceptor
头文件#include"Acceptor.h"#include"Logger.h"#include"InetAddress.h"#include<unistd.h>#include<errno.h>#include<sys/socket.h>#include<sys/types.h>static int createNonblocking(){ //IPPROTO_TCP 改成0 int sockfd = socket(A
2022-02-15 14:29:02 1066
原创 网络IO的阻塞&非阻塞&同步&异步,五种IO模型
网络IO接口调用分为两个阶段–数据准备和数据读写1.数据准备 (操作系统方面)ssize recv(int sockfd,void *buf,size_t len,int flags)\//flags默认为0当文件描述符为非阻塞时,recv的返回值 size:-1&&errnoEAGAIN 如果只是-1,那么是系统发生错误,或者链接异常断开等。如果再继续errnoEAGAIN,则为文件描述符为非阻塞并且没有数据到来0 网络对端关闭了链接size>0 数据的字节阻塞:调
2022-01-19 10:59:53 456
原创 进程组,守护进程,线程,互斥锁及一些杂项(个人笔记)
进程组父进程是组长,只要进程组中有一个进程,这个进程组就不会消失。如果组长死亡,那么该组就没用组长,但是进程组依然存在。创建会话注意事项进程组组长不能创建会话,因此一般创建子进程,然后父进程退出,由子进程来创建会话创建会话的进程,会成为进程组组长和该会话的会长。创建守护进程模型父进程fork子进程,然后父进程退出目的是:子进程肯定不会是进程组的组长,为后续调用setsid函数提供条件(setsid函数调用不可以是进程组组长)子进程调用setsid函数创建一个新的会话子进程成为
2021-07-23 15:21:01 150
原创 函数对象&仿函数&谓词
函数对象函数对象的概念重载函数调用操作符的类,其对象常称为函数对象函数对象使用重载的()时,行为类似函数调用,也叫仿函数本质:函数对象(仿函数)是一个类,不是一个函数函数对象使用特点:函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值函数对象超出普通函数的概念,函数对象可以有自己的状态函数对象可以作为参数传递谓词谓词概念返回bool类型的仿函数称为谓词如果operator()接受一个参数,那么叫做一元谓词如果operator()接受两个参数,那么叫做二
2021-03-29 23:31:08 145
原创 map容器
map/multimuap容器基本概念简介:map中所有元素都是pairpair中第一个值为 key(键值),起到索引的作用,第二个元素为value(实值)所有元素都会根据元素的键值自动排序本质:map/multimap容器属于关联式容器,底层结构是用二叉树实现优点可以根据key值快速找到value值map于multimap的区别:和set于multiset类似map不允许容器中有重复的键值multimap允许容器中有重复的键值map构造和赋值构造:map
2021-03-29 13:09:13 166
原创 set容器
set/multiset容器基本概念所有元素在插入时会自动排序(从小到大)本质set/multiset属于关联式容器,底层结构是用二叉树实现set和multiset的区别set不允许容器中有重复的元素multiset允许有重复元素set容器构造函数set容器没有push_back的插入元素方式,只能用insertset容器依然有拷贝构造当set容器中插入相同的数据时,编译器不会报错,但实际上并不会插入重复的数据set<int>s;s.insert(20);s.in
2021-03-28 23:45:07 897
原创 stack,queue和list容器
stack容器基本概念stack容器其实就是栈,先进后出。stack常用接口构造函数:stackstk; 和其它容器一样stack(const stack&stk) 拷贝构造函数赋值操作:stack&operator=(const stack&stk)重载等号操作数据存取push(elem) 向栈顶添加元素pop() 从栈顶移除第一个元素top() 返回栈顶元素大小操作
2021-03-28 23:25:29 402
原创 deque容器
deque容器deque容器基本概念功能:双端数组,可以对头端进行插入删除操作deque与vector的区别:vector对于头部的插入删除效率低,数据量越大,效率越低deque相对而言,对头部的插入删除速度比vector快vector访问元素的速度会比deque快,这与两者内部实现有关deque构造函数deque容器的构造函数和vector容器一致函数原型:deque<T>v; 采用模板实现 deque(v.begin(),v.end()) 从第一个元
2021-03-19 23:35:21 105
原创 vector容器
vector容器基本概念功能:vector数据结构和数组非常相似,也称为单端数组与普通数组的区别不同之处在与数组是静态空间,而vector可以动态扩展动态扩展并不是在原空间后面续新空间,而是找到更大的内存存储,再把原来的销毁vector容器的几个迭代器v.begin()指向第一个元素v.end()指向最后一个元素的后一个位置v.rend()指向第一个元素的前一个位置v.rbegin()指向最后一个元素vector构造函数功能:创建vector容器函数原型:vector<
2021-03-19 23:29:58 115
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人