前言:
这算是第二次系统地阅读UNPv1,正如副标题,不希望写成书摘、缩写版,尽量多写写个人体会和获得的经验,因此很多地方都会从全书的角度来说明,而不仅仅限于某个章节内部。
SCTP、信号驱动I/O、广播和多播等内容不包括在内。
准备工作:
(1)vim插件搭建
从别人那里拷贝现成的的.vimrc和插件,分别放于/home/用户名 和/home/用户名/vim文件夹下就行了。
(2)Xshell远程登录
热身:出错处理和包裹函数
UNP中的代码风格有一点是使用包裹函数和作者编写出错处理库相结合,这使得初学者可以把注意力集中在学习主干代码本身,而不是在初学阶段就不得不对所用到的函数考虑出错处理,同时这并不影响代码的稳健型,仍然提供了出错时的提示和处理功能。因此复习的第一步是从出错处理开始,这是UNP附录D.3的内容,几个错误处理函数按照错误的差异决定以abort()、exit(1)、还是return做结尾;而出错信息的处理有一个使用了可变参数列表的函数来完成,它按照需要把出错信息传递给syslog或是标准错误输出。
包裹函数根据其调用函数的出错情况来调用出错处理,并且把全局变量errno预存,处理完再返回,防止其他进程覆盖。
第一章 & 第二章 基础知识
对于netstat -i -a -n的各列含义,如果不明白可以使用ifconfig <指定接口>来查看。
本来想了解一下套接字相关函数实现,但是发现它们的代码比较复杂也比较长,没有深入下去,如果读者有兴趣可以自行参考《Linux内核情景分析》。了解了一部分内容:套接字描述符其实是特殊的已打开文件,这形成了一种特殊的文件系统sockfd。与文件系统的关联:i_mode中S_IFSOCK标志位设为1,并将i_sock也设为1。(对文件系统知识的缺乏也是没有深入看下去的原因。)
关于这些函数关系的比喻:“sokcet()是安装电话机,bind()为它指定一个使用的号码,connect()是向某个号码的服务器拨号。”
TCP状态转换图很经典,结合这个图可以对各个函数(bind、listen、connect、accept、close)作出的状态转换(阻塞时的状态、返回时机等)有更好的理解。状态可以用netstat -anp|grep <#port>来查看,在后续的程序运行和调试中使用这个命令能加深对状态和其转换的理解。
习题2.5回顾了MSS和路径MTU发现功能的关系,值得看一看。
第三章 & 第四章 常用函数与数据结构
通用套接字的意义:使用sockaddr的强制转换可以使套接字函数能够处理来自所有支持的任何协议族的套接字结构,这也是为什么它们需要一个这个结构的长度作为参数的原因。
UNP提供readline的原因是read和write不能够按行处理缓冲区。
socket()的参数表比较有意思,后两个参数会相互限定,但是由于这个限制不是唯一的,不可能把三个参数简化成两个参数。这么讲比较抽象,请结合图4-5来理解。
connect()的出错:超时、不可达、拒绝(可达但是不提供请求的服务)。
bind()通常是服务器需要进行而客户不必进行的。事实上客户限定的套接字是由内核决定,绑定非通配地址后,解复用由内核而不是进程完成。
listen()的backlog参数UNP解释的比较含混,准确的解释可以在man里看到,并与具体系统有关。
每个文件或套接字都有一个引用计数(对于python,任何对象都有),这也相对于后面对close()和shutdown()差异的解释(前者引用计数-1,为0时关闭;后者直接关闭并发送TCP连接终止消息)。
第五章 基本TCP编程 & 第八章 基本UDP套接字编程
第六章 I/O复用(select、poll、kqueue、epoll)& 第十六章 与非阻塞I/O
而对于UNP的第十六章的非阻塞I/O,基本都是通过设置套接字为非阻塞模式并select来实现的。但是非阻塞I/O并没有投入睡眠,而是反复地进行系统调用(6.2 I/O模型)。
同时,6.4~6.6节非常绕口的解释了为什么stdio和select混合使用时非常容易犯错误的:对EOF的处理会导致函数的退出,而这时发送缓冲区可能还有内容要处理。
第七章 套接字选项 & 第十一章 名字地址转换 & 第十四章 高级I/O函数
内容很多,但是没必要一条一条记着,有需要再查就行。
第十一章提供的一些函数比较好用(tcp_listen等),可以作为自己以后用的库函数。
第十三章 守护进程
编写的daemon_init()可以守护进程化当前进程,值得加入函数库。
第三十章 C/S设计范式
这章比较综合,将不同的C/S实现方式做了个综合和比较,包含了迭代模型、进程模型、线程模型、简单的进程/线程池(预先派生,任务分配和均衡由内核完成)、进程互斥方式(文件锁和线程锁)、描述符传递(使用到了UNIX域套接字)等,并且还包含了进程使用的用户/系统时间的测定,非常有价值,建议读者把这部分代码动手实现一下。
另外第十二章的IPv4/v6互操作性简单读了下。
本文转自五岳博客园博客,原文链接:www.cnblogs.com/wuyuegb2312/archive/2013/03/31/2910059.html,如需转载请自行联系原作者