由于前面两节是作者介绍本书的一些基本知识和相关约定,在遇到第一example的时候被那些系统的type定义和相关的头文件的约定的符号吓到了。然后就直接跳到第三章了,等有了比较好的理解之后后再回去看part1。
慢慢发现很多书的第一二章都是对全书的一个缩影,一开始相对来说想要彻底弄明白会比较困难,很多时候我都只是对一些相关约定进行大概的了解,并没有深入追究。
第三章介绍了socket的数据结构,不同系统有不同的定义,还包括IPv6版本的。但最基本的都包括有ip address,structure len,af(address family)等。还解释了为什么ip address字段为什么是一个struct结构。(历史遗留原因),下面是一个ipv4的socket定义:
上面的uint8_t,in_port_t等数据类型的定义在<sys/types.h>可以查找到。
函数调用socket数据结构的时候都是引用调用,通过指针来传递。在这里一个比较有意思的是在一些函数传递socket长度的时候不是传递一个具体大小,而是一个长度变量的引用(&),书本的解释是这是个value-result argument,在传给内核的时候是以value的形式传递的,内核经过处理之后是以处理的结果大小来传回给process。
接下来介绍了不同操作系统对高低字节处理的不同,网络ip address和我们常用的“125.33.78.99”地址之间的转换函数,对I/O的处理函数read和write,作者还介绍了改进版的readn和writen和readline函数。这些基础函数的介绍都是为后面的章节做铺垫的。下面简单介绍函数:
bzero是把nbytes个字节的目的地址全部赋值为0;
bcopy是把src地址的值复制nbytes个字节到dest;
bcmp当相等的时候返回0。
以上函数实现网络字节(network byte)和字符串(ASCII string)相互转换,其中a前缀代表ascii,n代表network。但要注意上面的函数只对ipv4有效。而下面的两个函数对ipv4和ipv6都有用: