学习 《UNIX网络编程》
学习本书之前,为了了解C语言,先通读了《C程序设计语言》。但对C语言的理解、熟悉可能还是不足,所以在学习本书的过程中,遇到看不懂的C代码,还要去查询、思考。
本书一开始,我就遇到了问题,运行不了程序。不知道在 MACOS 上面应该怎么编译并使其运行。所以学习编译并运行C代码。
OK,现在我们知道如何编译并运行文件了。
第一章
练习

1.3
socket error: Address family not supported by protocol family
1.4
在 while 函数体首行中添加
++bigger_than_zero_times;
1.5
for (int i=0; i<sizeof(buff); ++i) {
Write(connfd, &buff[i], strlen(&buff[i]));
}
输出是这样
$ ./daytimetcpcli 127.0.0.1
Tue May 30 21:12:38 2017
ue May 30 21:12:38 2017
e May 30 21:12:38 2017
May 30 21:12:38 2017
May 30 21:12:38 2017
ay 30 21:12:38 2017
y 30 21:12:38 2017
30 21:12:38 2017
30 21:12:38 2017
0 21:12:38 2017
21:12:38 2017
21:12:38 2017
1:12:38 2017
:12:38 2017
12:38 2017
2:38 2017
:38 2017
38 2017
8 2017
2017
2017
017
17
7
还有乱码
有错误。我是想输出一个字符,而实际输出的是 i 之后的所有字符。原因是 strlen(&buff[i]) 这里写了输出的长度。这里改为 1 就正常了。
sizeof 要改成 strlen
所以答案是
for (int i=0; i<strlen(buff); ++i) {
Write(connfd, &buff[i], 1);
}
第二章
2.1 进入 https://www.iana.org/ 后没有找到 IPV0, IPV1的信息
参考答案:
在站内搜索 Version Numbers
Decimal ![]() |
Keyword ![]() |
Version ![]() |
Reference ![]() |
|---|---|---|---|
| 0-1 | Reserved | [Jon_Postel][RFC4928] | |
| 2-3 | Unassigned | [Jon_Postel] | |
| 4 | IP | Internet Protocol | [RFC791][Jon_Postel] |
| 5 | ST | ST Datagram Mode | [RFC1819][Jim_Forgie] |
| 6 | IPv6 | Internet Protocol version 6 | [RFC-ietf-6man-rfc2460bis-13] |
| 7 | TP/IX | TP/IX: The Next Internet | [RFC6814] |
| 8 | PIP | The P Internet Protocol | [RFC1621] |
| 9 | TUBA | TUBA | [RFC1347] |
| 10-14 | Unassigned | [Jon_Postel] | |
| 15 | Reserved | [Jon_Postel] |
2.2 直接google搜索咯。
IPv5 used IPv4's 32-bit addressing, which eventually became a problem. The format of IPv4 addresses is one you have probably encountered before, in the ###.###.###.### format. Unfortunately, IPv4 is limited in the number of addresses available, and by 2011 the last remaining blocks of IPv4 addresses were allocated. IPv5 would have suffered from the same limitation.
However, IPv6 was developed in the 1990s to solve the addressing limitation, and commercial deployment of this new internet protocol began in 2006.
So, IPv5 was abandoned before ever becoming a standard, and the world moved on to IPv6.
参考答案:通过 RFC-INDEX 查找或者 google "ipv5 rfc"
在 RFC-INDEX 中没有找到 IPV5,应该是关键字不对
2.3
发送最小的包的大小,这样所有的线路都能够支持。
MTU:最大传输单元
MSS:最大分节大小,用于向对端TCP通告对端在每个分节中能够发送的最大TCP数据量。MSS经常设置成MTU减去IP和TCP首部的固定长度
最小重组缓冲区大小:IPv4和IPv6的任何实现都必须保证支持的最小数据报大小。对于IPv4是576字节,对于IPv6是1500字节。
所以 536 = 576 - 20(IPv4首部) - 20(TCP首部)
2.4
与书上的图一样吧。但是 26 个字节的作用是什么?说明数据传输的次数?
参考答案:这里执行关闭的是服务器而不是客户
2.5

以太网的MTU是1500字节。TCP 首部 + IP 首部 = 20 + 20 = 40字节;所以不能超过1500-40=1460字节
2.6
OSPF 的协议号 -》 OSPF protocol number
进入 https://www.iana.org/, 搜索 Protocol Numbers,进入 https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml,页面内搜索OSPF,得到
| 89 | OSPFIGP | OSPFIGP | [RFC1583][RFC2328][RFC5340][John_Moy] |
所以协议号是 89
2.7
累计确认点
选择性确认点

第三章
习题

3.1

由于C中函数不能改变按值传递的参数的值。而这里又需要更改参数的值,所以必须传递指针。
3.2
void 类型指针的作用
因为结果就是 char 类型,所以使用 char 类型的指针
参考答案:

void指针间接引用前需要声明类型/类型转换。
3.3
如果函数出错将返回一个负值,并将errno设置为EAFNOSUPPORT,如果参数af指定的地址族和src格式不对,函数将返回0。
意思是:更严格的函数报错了,就调用更宽松的函数。
第四章
服务器已连接套接字


已完成队列中储存的不是已连接的套接字吗?

Fork 与 并发服务器
我认为Fork 之后连接应该还是 1 个吧?只是 connfd 的引用计数加一。
但是书上画了两个连接。

习题

是大端则为主机字节序。
如何判断大端
void IsBigEndian()
{
short int a = 0x1122;//十六进制,一个数值占4位
char b = *(char *)&a; //通过将short(2字节)强制类型转换成char单字节,b指向a的起始字节(低字节)
if( b == 0x11)//低字节存的是数据的高字节数据
{
//是大端模式
}
else
{
//是小端模式
}
}
参考答案:


使用 getsockname 以及 sock_ntop 的方法。


子进程在父进程前执行完。那么子进程 close 之后,已连接套接字的引用计数减一,即 2 - 1 = 1 个。然后父进程调用 close,引用计数减一后变为 0。那么就关闭套接字,出发 TCP 的 FIN 以进行资源回收。

4.4 由于没有调用 listen,所以套接字还是主动套接字,所以不能接收到请求。客户端连接到那个端口后会发现没有应用程序在监听那个端口,会受到服务器的 RST 响应。
参考答案:

4.5 没有 bind,那么内核会随机绑定一对 IP 地址、临时端口给那个套接字。调用 listen 后,服务端正常监听,可以正常工作。但是需要查询才能获得服务端的IP 地址、端口号。
学习 《UNIX网络编程》的更多相关文章
- 鸟哥的LINUX私房菜基础篇第三版 阅读笔记 一
1. Linux的档案权限与目录配置 一.基础知识: a.分为三类,拥有者(owner).群组(group).其他人(other) b.三个核 ...
- 鸟哥的LINUX私房菜基础篇第三版 阅读笔记 四 档案的文件系统的压缩和打包
1.压缩文件案的用途与技术 a.用途,简单来说,就是节约磁盘空间.如果从传输角度讲,占用宽带也会小很多(Apache就有自动压缩的功能,节省宽带资源,提升网站的输出能力) b.压缩技术 ...
- 鸟哥的LINUX私房菜基础篇第三版 阅读笔记 三 Linux磁盘与文件系统管理
一.认识EXT2文件系统: a.硬盘的组成:转动小马达+存储的磁盘+读写的机械臂 b.磁盘的一些概念 扇区为最小的物理储存单位,每个扇区为512B ...
- 鸟哥的LINUX私房菜基础篇第三版 阅读笔记 二
Linux档案与目录管理 1.一些比较特殊的目录,需要用力的记下来 . 代表当前层目录 .. 代表上一层目录 - 代表前一个工作目录 (这个好屌!其他的 ...
- 《鸟哥的Linux私房菜--基础篇》学习
第四章 显示日期与时间的指令:date 输入: (base) liyihuadeMacBook-Pro:~ liyihua$ date 输出: Thu Jun 6 08:44:02 CST 2019 ...
- 拒绝从入门到放弃_《鸟哥的 Linux 私房菜 — 基础学习篇(第三版)》必读目录
目录 目录 前言 关于这本书 必看知识点 最后 前言 相信部分刚进入这个行业的新同学会对一个问题感到疑惑,为什么从培训学校出来的学员不被欢迎? 这里记录下一些我个人的看法(博主也曾有面试新员工的经历) ...
- 每周一书-《鸟哥的Linux私房菜基础学习篇(第四版)》台湾原版,你想要吗?
首先说明,本周活动有效时间为2016年10月19日到2016年10月31日. 目在介绍这本书之前,首先要感谢QQ号为:1084830483(路在远方),来自哈尔滨工程大学的同学赠送给玄魂工作室的 ...
- 【Linux】鸟哥的Linux私房菜基础学习篇整理(一)
最近,一直在写PPC的模拟器和汇编器,也在做设计.所以重新看了看<鸟哥的Linux私房菜>,还是有好多命令不太熟悉.就打算写几篇blog记下来. 1. nl [-bnw] filename ...
- 《鸟哥的Linux私房菜-基础学习篇(第三版)》(三)
第2章 Linxu怎样学习 1. Linux当前的应用角色 当前的Linux常见的应用可略分为企业应用和个人应用双方面. 首先谈了企业环境的利用. 1)网络server. 2)关键任务 ...
- 鸟哥的Linux私房菜 基础学习篇读书笔记(9):Linux磁盘与文件系统管理(2)
上一篇文章主要从理论上分析了Linux的Ext2文件系统.这一篇主要解说怎样查看Linux的文件系统的容量以及解说Linux文件系统中的连接文件. 能够通过df和du命令来查看磁盘与文件夹的容量.df ...
随机推荐
- Linux 时间修改--date -s命令
Linux 时间修改 不重启修改时区 一.修改linux的时间root使用date指令:date -s1.只修改日期,不修改时间,输入:Linux代码 1. date -s 2007-08-03 da ...
- 转: android emulator 命令详解
在命令行输入: emulator -help,即可显示emulator支持的所有命令. Android Emulator usage: emulator [options] [-qemu args] ...
- tony_nginx的安装和配置
yum安装nginx Centos默认的yum源里没有nginx,需要手动添加源,有两种方法: 使用nginx提供的一个源设置安装包 nginx下载页面:http://nginx.org/en/dow ...
- 深入理解get和post的区别
GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二.最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 正常GET和 ...
- ZOJ 1364 Machine Schedule(二分图最大匹配)
题意 机器调度问题 有两个机器A,B A有n种工作模式0...n-1 B有m种工作模式0...m-1 然后又k个任务要做 每一个任务能够用A机器的模式i或b机器的模式j来完毕 机器開始都处于模式0 每 ...
- 设备模型的基础---kobject,kset
设备模型的基础是kobject,kset,kobj_type.kobject本身并没有什么意义,真正有用的地方在于嵌入了kobject的结构体(对象),kobject可以看成是一个最小单元,sysfs ...
- codeforces #364a Cards
cf的a题没什么好说到,100的量级,每个人给2张牌,使每个人手中的牌点数相等.保证有一种分配方案. 对每个人,先计算出手中的牌的点数,然后循环两遍拿牌就可以. A. Cards time lim ...
- ltp的使用
ltp 可以分词 词性识别 命名实体识别,使用过程: import pyltp from pyltp import SentenceSplitter from pyltp import Segment ...
- 更改系统环境设置,让alias永远生效
alias(中文称为“别名”)允许使用更加简短的名称来重新定义 Linux 中的 Shell 命令,从而简化命令行的输入.如果经常与 CLI 打交道,那么使用 alias 不仅会节省时间,而且 ...
- 如何使用 TP中的公共函数 (定义在common/common.php中的函数)
如何使用 TP中的公共函数 (定义在common/common.php中的函数) (2011-09-30 15:32:09) 转载▼ 标签: 杂谈 1.在common/common.php 中有个 ...

