
Linux网络编程
文章平均质量分 77
Tanswer_
纸上得来终觉浅,绝知此事要躬行!
展开
-
Redis 和 I/O 多路复用
最近在看 UNIX 网络编程并研究了一下 Redis 的实现,感觉 Redis 的源代码十分适合阅读和分析,其中 I/O 多路复用(mutiplexing)部分的实现非常干净和优雅,在这里想对这部分的内容进行简单的整理。几种 I/O 模型为什么 Redis 中要使用 I/O 多路复用这种技术呢?首先,Redis 是跑在单线程中的,所有的操作都是按照顺序线性执行的,但是由于读写操作等待用户输入或输出都转载 2017-04-16 16:21:00 · 4818 阅读 · 2 评论 -
Muduo网络库源码分析之对socket及其相关操作的封装
主要涉及到的类和实现文件有:Endian.h 提供了字节序转换的函数。Socket.h/Socket.cc socketfd 的封装,提供了绑定地址、开始listen、接受连接等操作,并可设置套接字选项。InetAddress.h/InetAddress.cc 套接字地址的封装,提供了多种方式初始化一个地址,还提供方法从地址中拿到 ip 和 port。SocketsOps.h/原创 2018-01-09 15:14:11 · 1354 阅读 · 0 评论 -
Muduo网络库源码分析之Reactor模式的关键结构
本文分析一下Reactor模式的实现,关键是三个类:Channel、Poller、EventLoop。事件分发类 ChannelChannel 是 selectable IO channel,负责注册与响应IO事件,包括注册给Poller的 fd 及其监听的事件,以及事件发生了所调的回调函数。 每个Channel对象自始至终只负责一个 fd 的事件分发,封装了一系列该 fd 对应的操原创 2018-01-06 18:36:02 · 1496 阅读 · 1 评论 -
Muduo网络库源码分析之TcpConnection Class
用于管理一个具体的 TCP 连接,比如消息的接收与发送,完成用户指定的连接回调 connectionCallback。TcpConnection 构造时接收参数有 TCP 连接的 sockfd,服务端地址 localAddr,客户端地址 peerAddr,并通过 Socket 封装 sockfd。并用 Channel 管理该 sockfd,向 Channel 注册可读、可写、关闭、出错回调函数原创 2018-01-17 15:04:45 · 917 阅读 · 0 评论 -
eventfd 的分析与具体例子
eventfd 介绍Linux 2.6.27后添加了一个新的特性,就是eventfd,是用来实现多进程或多线程的之间的事件通知的。接口#include int eventfd(unsigned int initval, int flags);这个函数会创建一个事件对象(eventfd object),返回一个文件描述符,用来实现进程或线程间的等待/通知(wait/notify原创 2018-01-08 23:22:55 · 6766 阅读 · 1 评论 -
编写网络服务程序的常用编程模型
今天大概总结一下编写服务端程序常用的编程模型。参考UNP第三版第三十章和陈硕的muduo那本书,强烈建议仔细阅读。注意以下代码只是为了显式框架或者说编程模型,不是完整的程序,深夜写的比较任性,不要见怪。accept + read/write这个不是并发服务器,而是迭代服务器(iterative server)。 它一次服务一个客户。不适合长连接,适合 daytime 这种 write-原创 2018-01-25 02:32:20 · 1186 阅读 · 1 评论 -
Muduo网络库源码分析之定时器的实现
muduo 的定时器功能由三个 class 实现,TimerId、Timer 和 TimerQueue。TimerId 类它唯一标识一个 Timer 定时器。TimerId Class 同时保存Timer* 和 sequence_,这个 sequence_ 是每个 Timer 对象有一个全局递增的序列号 int64_t sequence_,用原子计数器(AtomicInt64)生成。原创 2018-01-07 15:41:05 · 1324 阅读 · 0 评论 -
Muduo网络库源码分析之Acceptor和TcpServer
Acceptor用于 accept 一个 TCP 连接,accept 接受成功后通知 TCP 连接的使用者。Acceptor 主要是供 TcpServer 使用的,其生命期由后者控制。一个 Acceptor 相当于持有服务端的一个 socket 描述符,该 socket 可以 accept 多个 TCP 客户连接,这个 accept 操作就是 Acceptor 实现的。这里用到了一些封装好原创 2018-01-12 22:43:03 · 1058 阅读 · 0 评论 -
FastCGI 协议分析与C语言实现实例
考虑让我的 web server 增加对 PHP 的支持,这就要用到 php 解析器来将客户端请求的 php 文件解析为静态资源,再由我的 web server 将其返回到客户端,php-fpm 就可以来帮我们完成这个工作。可是我的 web server 如何与 php-fpm 通信呢? 接下来就是本文的主角:FastCGI 。FastCGI 实现与测试代码:https://github.com/T原创 2017-12-23 14:46:54 · 2013 阅读 · 0 评论 -
[Web Server](一)Tiny Web Server分析
写在前面: 计划写一个Web 服务器,在小组的群博上没有找到相关的文章,自己打算从开始记录下这个过程,一是整理清楚我的构建过程,二是也能让后面的同学做一下参考。CSAPP上网络编程那一章最后实现了一个小但是功能较齐全的Web 服务器,叫做TINY。因为只是知道HTTP协议的一些概念,还不太清楚一个Web服务器的工作流程和代码组织结构,而书上给出了 Tiny Server 的完整实现,代码非常短原创 2017-11-19 21:23:24 · 2190 阅读 · 0 评论 -
系统级 I/O与缓冲机制
从I/O,到缓冲区都会谈到。首先是所有语言都提供了执行I/O的较高级别的工具,例如ANSI C提供了标准I/O库,C++重载了<<和>>等,这些不依赖于系统内核,所以移植性强,而且这个缓冲区的分配长度和优化等细节都是代你处理好了。在Unix系统中,是通过使用有内核提供的系统级Unix I/O函数来实现这些较高级别的I/O函数的。原创 2017-11-16 19:52:35 · 1531 阅读 · 0 评论 -
TCP连接的关闭
多线程多进程关闭连接的区别首先来看看close和shutdown两个系统调用对应的内核函数:#define __NR_close 3 __SYSCALL(__NR_close, sys_close) #define __NR_shutdown 48 __SYSCALL(__NR原创 2017-11-02 11:47:30 · 3451 阅读 · 0 评论 -
TCP半连接与全连接队列及accept建立连接
我们知道当服务器绑定、监听了指定端口后,内核通常会为每一个LISTEN状态的socket维护两个队列:SYN队列(半连接队列):由/proc/sys/net/ipv4/tcp_max_syn_backlog指定,表示处于 SYN_RECV 状态的队列ACCEPT队列(全连接队列):由listen()函数的第二个参数 backlog 指定,内核硬限制由 net.core.somaxconn 限制,原创 2017-10-28 14:03:12 · 5560 阅读 · 0 评论 -
Redis网络库源码浅解
Redis网络模型是一个使用IO多路复用、单线程、非阻塞的模型。这个模型的优点在于单线程不用考虑加锁,如果在单核环境上可以将效率发挥到最大。它没有那么庞大,代码一共2000多行,因此比较容易分析,学长推荐。 另外@浅墨学长拿出了redis网络部分的代码,设计了应用层协议,添加了应用层buffer,定义了服务器类型,完成了一个基于Redis网络模型的简易网络库,我fork了一份,然后跟着学长的博客原创 2017-08-12 16:43:52 · 1898 阅读 · 0 评论 -
PHP socket编程示例
写在前面:最级要开始写我们的项目了,是一个网络编程的项目,语言用C++,基于Socket通信,采用JSON数据交换格式,存数据用Mysql数据库。我们开始的困难是不知道如何处理客户端,组内都没有学写APP,如果是在终端下跑那就有太多限制了,感觉反而是加大了难度。 纠结了一会,突然想到能不能用PHP来写客户端,我学过一段时间PHP,目前还不太了解高阶的用法,前不久写了一个简单的订餐系统,用到原创 2017-07-19 15:14:50 · 1678 阅读 · 3 评论 -
make 出现 OOM???
心情烦躁,随便翻翻博客,好久没更新了,来写篇水博,冷静一下。这周编译一个项目的时候,出现 error,如下:看到 cc1plus 被 killed 了,第一反应是不是因为 OOM killed 掉了,本来云服务器就只有 1G 内存。用 dmesg 看一下吧,果然:那怎么办,使用 swap 吧,需要开启一下,默认是关闭的。使用交换文件来做交换分区。// 先创建交换文件falloca...原创 2019-04-25 14:13:09 · 612 阅读 · 0 评论