从6月开始,陆续关注了极客时间的几个专栏,这个知识付费平台给我的感觉是质量还蛮高的,里面的授课讲师也都是业内大牛。我自己购买学习了下面三门课程,分别是《数据结构与算法之美》、《从0开始学架构》、《Nginx核心知识100讲》,我觉着对一名Linux C/C++后台开发新手或者刚入门的同学来说,这三门课程还是很值的推荐的,干货满满,关于详细介绍和具体内容,大家可以扫下面二维码,自己去了解一下。 推荐一下陶辉大神的博客:陶辉的博客 一起成长! 作者:Tanswer_ 发表于 2018/11/07 21:57:38 原文链接 https://blog.csdn.net/Tanswer_/article/details/83832744 阅读:55 继续阅读 >>


杜肖孟 18/11/07 21:57:38
学习总结一下官方发布的C版本客户端 hiredis,了解hiredis 客户端大致实现细节。在理解代码之间需要了解通信协议的特点,我上一篇转载的文章已经有过介绍,大家可以去看一下。 hiredis 提供了同步、异步访问,异步 API 需要与一些事件库协同工作,主要看一下同步API的实现。 hiredis 与服务端通信的API比较简单,主要有这几个步骤: 建立连接 发送命令 等待结果并处理 释放连接 一、相关数据结构 redisContext 保存连接建立后的上下文。 err 保存错误码,如果为0表示没错,如果非0那么错误说明保存在 errstr 中;fd是连接建立后的套接字;flags表示连接的标识;obuf 保存要向 redis-server 发送的命令内容;reader 用来读取从服务端返回的消息,redisReader中的buf成员用来保存内容;connection_type 表示连接类型,有两种分别是REDIS_CONN_TCP 和 REDIS_CONN_UNIX;timeou 继续阅读 >>


杜肖孟 18/06/28 21:03:07
本文档翻译自: http://redis.io/topics/protocol 。 Redis 协议在以下三个目标之间进行折中: 易于实现 可以高效地被计算机分析(parse) 可以很容易地被人类读懂 网络层 客户端和服务器通过 TCP 连接来进行数据交互, 服务器默认的端口号为 6379 。 客户端和服务器发送的命令或数据一律以 \r\n (CRLF)结尾。 请求 Redis 服务器接受命令以及命令的参数。 服务器会在接到命令之后,对命令进行处理,并将命令的回复传送回客户端。 新版统一请求协议 新版统一请求协议在 Redis 1.2 版本中引入, 并最终在 Redis 2.0 版本成为 Redis 服务器通信的标准方式。 你的 Redis 客户端应该按照这个新版协议来进行实现。 在这个协议中, 所有发送至 Redis 服务器的参数都是二进制安全(binary safe)的。 以下是这个协议的一般形式: *<参数数量> CR LF $< 继续阅读 >>


杜肖孟 18/06/28 17:41:22
每次安装Linux的时候,都会要求配置交换分区,那么这个分区是干嘛的呢?不设置这个分区有什么后果?如果一定要设置,设置多大比较合适?本篇将试图回答这些问题并尽量覆盖所有swap相关的知识。 下面的所有例子都在ubuntu-server-x86_64 16.04下执行通过 什么是swap? swap space是磁盘上的一块区域,可以是一个分区,也可以是一个文件,或者是他们的组合。简单点说,当系统物理内存吃紧时,Linux会将内存中不常访问的数据保存到swap上,这样系统就有更多的物理内存为各个进程服务,而当系统需要访问swap上存储的内容时,再将swap上的数据加载到内存中,这就是我们常说的swap out和swap in。 为什么需要swap? 要回答这个问题,就需要回答swap给我们带来了哪些好处。 对于一些大型的应用程序(如LibreOffice、video editor等),在启动的过程中会使用大量的内存,但这些内存很多时候只是在启动的时候用一下,后面的运行过程中很少再用到 继续阅读 >>


杜肖孟 18/06/23 18:18:46
DNS协议详解及报文格式分析 作者:Tanswer_ 发表于 2018/06/11 20:54:17 原文链接 https://blog.csdn.net/Tanswer_/article/details/80657756 阅读:60 继续阅读 >>


杜肖孟 18/06/11 20:54:17
无锁队列的实现-coolshell CAS 另一篇参考 设计不使用互斥锁的并发数据结构 锁粒度 作者:Tanswer_ 发表于 2018/03/24 13:20:09 原文链接 https://blog.csdn.net/Tanswer_/article/details/79677069 阅读:203 评论:1 查看评论 继续阅读 >>


杜肖孟 18/03/24 13:20:09
继承关系下的构造和析构 看一下测试代码: /* * @filename: Inheritance.cpp * @author: Tanswer * @date: 2018年01月31日 14:59:28 * @description: 测试继承关系下的构造和析构 */ #include<iostream> using namespace std; class Base { public: Base(){ cout << "Base ctor ..." << endl; } virtual ~Base(){ cout << "Base dtor ..." << endl; } }; class Derived:public Base { public: D 继续阅读 >>


杜肖孟 18/01/31 16:25:55
今天大概总结一下编写服务端程序常用的编程模型。参考UNP第三版第三十章和陈硕的muduo那本书,强烈建议仔细阅读。注意以下代码只是为了显式框架或者说编程模型,不是完整的程序,深夜写的比较任性,不要见怪。 accept + read/write 这个不是并发服务器,而是迭代服务器(iterative server)。 它一次服务一个客户。不适合长连接,适合 daytime 这种 write-only 短连接服务。 void handle(client_socket, client_address) { while(true) { data = client_socket.recv(4096); if(data) client_socket.send(data); else do_error(); } } while(true){ connfd = server_socket.accept(); handle(client_socket, client_address); } accept 继续阅读 >>


杜肖孟 18/01/25 02:32:20
用于管理一个具体的 TCP 连接,比如消息的接收与发送,完成用户指定的连接回调 connectionCallback。 TcpConnection 构造时接收参数有 TCP 连接的 sockfd,服务端地址 localAddr,客户端地址 peerAddr,并通过 Socket 封装 sockfd。并用 Channel 管理该 sockfd,向 Channel 注册可读、可写、关闭、出错回调函数,用于 Poller 返回就绪事件后 Channel::handleEvent() 执行相应事件的回调。 TcpConnection 有四个状态,简单的状态图: TcpConnection 有一系列用户指定的事件回调函数,比如 TcpConnection::connectionCallback、messageCallback、writeCompleteCallback,这些是用户通过 TcpServer 传给 TcpConnection。当 Poller 返回 TcpConnection 对应的 Soc 继续阅读 >>


杜肖孟 18/01/17 15:04:45
Acceptor 用于 accept 一个 TCP 连接,accept 接受成功后通知 TCP 连接的使用者。Acceptor 主要是供 TcpServer 使用的,其生命期由后者控制。一个 Acceptor 相当于持有服务端的一个 socket 描述符,该 socket 可以 accept 多个 TCP 客户连接,这个 accept 操作就是 Acceptor 实现的。 这里用到了一些封装好的 socket 和地址结构,如 class InetAddress 表示 sockaddr_in 的封装,如可以通过ip地址和port端口生成一个sockaddr_in; class Socket封装了部分关于socket套接字的操作,如Socket::bindAddress(InetAddress&) 将socket和一个sockaddr_in地址绑定,Socket::accept(InetAddress& peerAddr)将一个socket允许连接一个客户端地址peerAddr,Sock 继续阅读 >>


杜肖孟 18/01/12 22:43:03