UNP Notes
好吧,我其实已经将这本书读过一遍啦,不过现在正在读书,用到这本书的知识的时候非常少,所以还是等到自己真正需要这个东西的时候再来更新吧!
lishuhuakai
这个作者很懒,什么都没留下…
展开
-
Ubuntu 16.04虚拟网络设备tun安装
Ubuntu 16.04虚拟网络设备tun安装最近编写网络程序,需要用到tun模块,但是官方给的发行版中压根就没有这个模块.不信的话,你可以测试一下:root@ubuntu:~# modinfo tunmodinfo: ERROR: Module tun not found.当然,如果你测试的结果是这样的:root@ubuntu:~# modinfo tunfilename: /li原创 2017-04-20 21:23:06 · 14332 阅读 · 6 评论 -
开始读redis的源码了
Redis是一个很简单的nosql类型的数据库,代码量相对来说是比较少的.但是代码风格确实比较漂亮.我打算花一段时间剖析一下它的代码,不光是看啦,看的话,收获是不大的.我打算从Redis那纷繁复杂,令人眼花缭乱的代码里剥出一个单机的数据库,能够运行的,但是没有那么多的错误处理代码,这样以来既可以学到作者的代码风格,也可以看到如何来实现一个数据库,同时还可以学习网络编程,确实是一举多得的原创 2016-11-24 15:54:03 · 10302 阅读 · 5 评论 -
一起来写ftp server 03 -- 加强版本
这一次的版本我们在第一版的基础上添加了一些有意思的东西,增强了我们的功能.下载限速和上传限速代码的实现里有一些很有意思的地方,下载限速和上传限速就是其中一例,这些东西听起来非常高大上,可是如果你真的做了的话,会发现这些东西真的也就是这样.限速的原理很简单,如果发现下载速度过快,那么我就休息一下,不下那么快,这样速度就降下来的.上传同理.SpeedBarrier/* 下载或者上传速度限制器 */cl原创 2016-11-15 22:42:38 · 945 阅读 · 0 评论 -
一起来写ftp server 02 -- 一次失败的尝试
上一个版本之中,最基本的功能已经实现了,但是可以明显地看得到, CmdHandle这个类过大,而DataHandle这个类又过小,所以,我想平衡一下,将CmdHandle这个类的数据传输部分分散至DataHandle这个类中,起先并没有想太多,只是想这么来干一下.这里需要注意一下的是,CmdHandle和DataHandle两个类的代码分别在两个进程中执行.不过,写着写着,我发现,这个想法是很愚蠢的原创 2016-11-15 21:59:35 · 947 阅读 · 0 评论 -
一起来写ftp server 01 -- 简易版本
一些坑,踩了就好了.写这个ftp server只是为了练一下手,写这种文章只是想记录一下我在编写这个ftp server的过程中的一些想法和收获.虽然编写这个玩意有点耗时,但是有一些坑,你不踩,你永远都不知道.我们应该用什么样的方式来实现我们的程序?这是一个老生长谈的问题,使用多线程,多进程还是别的什么方式?鉴于我们已经有了一个web server的经验,我们自然会想,可不可以采取多线程的方式来处原创 2016-11-15 21:27:58 · 3181 阅读 · 0 评论 -
一起来写web server 09 -- 最终版本
这次的代码是在前一次代码的基础上做一些点滴的修改.实现更好的封装,更漂亮的抽象.同时也是我们这个web server的最后一个版本了.这次的版本应该修改的幅度是最大的.EPOLLONESHOT 即使我们使用ET模式,一个socket上的某个事件还是可能被触发多次,这个并发程序中就会引起一个问题,比如说一个线程(或进程,下同)在读取完某个socket上的数据后开始处理这些数据,而在数据处理的过程中原创 2016-11-04 14:37:44 · 1239 阅读 · 1 评论 -
一起来写web server 08 -- 多线程+非阻塞IO+epoll
到了多线程,一些东西就变得耐人寻味了.这个版本是在前面单线程epoll的基础上引入了线程池,当然不是前面玩具一样的线程池,而是一个通用的组件,生产者消费者队列.生产者消费者队列生产者消费者问题是操作系统中一个很经典的同步互斥问题,已经有了很不错的解决方案,将它的解决方案拓展一下,就可以用于我们的实践啦.我自己写了一个生产者消费者的队列,然后发现muduo中已经内置了这种模型,而且使用起来比我写的更原创 2016-11-04 10:24:11 · 1144 阅读 · 0 评论 -
一起来写web server 07 -- 单线程非阻塞IO加强版本
这次的这个版本相对于前面的第6个版本有些许加强,那就是将epoll由LT模式变成了ET模式. 对于采用了LT工作模式的文件描述符,当epoll_wait检测到其上有事件发生并且将事件通知应用程序后,应用程序可以不立即处理该事件,这样,当应用程序下次调用epoll_wiat时,epoll_wait还会向应用程序通告此事件,直到该事件被处理.而对于采用ET工作模式的文件描述符,当epoll_wait原创 2016-11-04 09:24:46 · 866 阅读 · 0 评论 -
一起来写web server 06 -- 单线程非阻塞IO版本
阻塞IO的效率是在是低下,你如果要写高性能的web server的话,你必须使用非阻塞IO.非阻塞IO的读写在谈到非阻塞IO之前,必须先谈一谈阻塞IO,在网络编程中,我们假设有一个监听套接字的sockfd,这个sockfd是你调用了socket,listen, bind这一大票的函数得到的一个文件描述符.其实它默认就是阻塞的,具体的表现是:使用accept函数监听sockfd时,如果没有连接到来,原创 2016-11-04 08:44:04 · 2135 阅读 · 1 评论 -
一起来写web server 05 -- 多线程进阶版本
这个版本的web server比第4版稍微做了一点改进,那就是由主线程统一接收连接,然后连接的处理由子线程来完成.因此,这里就引入了条件变量以及同步互斥的问题.同步机制muduo库中有一个关于同步机制的封装,我这里就直接采用了.我这里来介绍一下这个封装吧.下面是Conditon这个类的代码:class Condition : noncopyable{ private: Mu原创 2016-11-04 01:22:23 · 667 阅读 · 0 评论 -
一起来写web server 04 -- 线程池版本
从这个版本开始,后面的代码差不多是越来越难啦.这个版本,我们主要是要实现一个线程池版本的web server.这个版本的设计出自UNP.思想思想非常简单,那就是父线程首先构建n多子线程,这些子线程全部争抢全局的一把锁,只有抢到了锁的线程才能够调用accept函数,否则都会阻塞掉.代码/*- * 线程池版本的web server.主要的思想是事先构建一个线程池,只是需要注意的是,accept的时候需原创 2016-11-04 00:33:34 · 939 阅读 · 1 评论 -
一起来写web server 03 -- 多线程版本
一起来写web server 03 – 多线程版本 错误的代码和正确的代码总是非常相似的!好吧,我们继续开干,这一次,我们来写一个多线程版本的web服务器.这次代码的思想十分简单,那就是一旦从客户端来了一个连接,就生成一个线程来处理这个连接.这种想法和之前的多进程版本非常类似.但是请注意进程和线程之间的差异.进程和线程的区别进程这种东西,一旦父进程调用fork函数,生成了一个子进程,那么子进程原创 2016-11-03 23:54:56 · 1169 阅读 · 1 评论 -
一起来写web server 02 -- 多进程版本
在UNP的第30章客户/服务器程序设计范式中提到了这种模型.主要的思想这种模型的思想非常简单,具体来说,就是,没当用户connect到来之后,立马fork一个子进程去处理连接,代码如下:int main(int argc, char *argv[]){ int listenfd = Open_listenfd(8080); /* 8080号端口监听 */ while (true) /原创 2016-11-03 23:21:30 · 1302 阅读 · 0 评论 -
一起来写web server 01 -- 单进程版本
csdn的markdown编辑器就是一个傻逼.web server的原理如果说,你仅仅是要实现一个简单的网页服务器,ok,这非常简单,用不了多少代码,因为它的原理实在是非常简单.客户端首先通过tcp/ip三次握手连接到服务器,然后向服务器发送http请求,这个请求大概长什么样子呢?我这里举一个栗子:GET /sample.jsp HTTP/1.1\r\nAccept: image/gif.ima原创 2016-11-03 12:52:22 · 1430 阅读 · 1 评论 -
一起来写web server 00 -- 准备工作
这篇文章是一个序言,我接下来想用9篇文章来记录一下我逐步迭代完成的这个不算漂亮的作品.server我早已经写完了,代码最后执行的效果如下图所示:上面的http://192.168.44.221:8080/代表的是一个内网地址,端口是8080,这代表这我们的web服务器工作在192.168.44.211这个地址所在的主机,监听于8080号端口.代码运行在ubuntu之上,对于原创 2016-11-03 00:28:13 · 1152 阅读 · 0 评论 -
开始之前...
摘要首先会更新一些书中用到的文件,如ourhdr.h,以及ourhdr.c文件,然后会简要地介绍一下里面用到的函数.书中用到的一些文件首先是要用到头文件:/*ourhdr.h*//*一下子写不了那么多,后面更新的时候慢慢来补*/#ifndef __ourhdr_h#define __ourhdr_h#include <sys/types.h>#include <stdio.h>#inclu原创 2015-10-16 00:19:59 · 1305 阅读 · 0 评论