学习 《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 ...
随机推荐
- win10系统怎样手动安装cab更新补丁
win10系统怎样手动安装cab更新补丁 1. 把所有补丁放进一个文件夹 例如 C:\UPDATE2. 以管理员运行命令提示符 3. 输入以下命令後按 Enterdism /online /add-p ...
- 详解CSS的相对定位和绝对定位(讲得很详细)
详解CSS的相对定位和绝对定位 CSS的相对定位和绝对定位通常情况下,我们元素的position属性的值默认为static 就是没有定位,元素出现在正常的文档流中,,这个时候你给这个元素设置的left ...
- javascript中的正則表達式
对文本数据进行操作是JavaScript中常见的任务.正則表達式通过同意程序猿指定字符串匹配的模式来简化诸如验证表单中输入是否具有正确格式之类的任务. 1.正則表達式标记: 字符 含义 举例 i 大写 ...
- linux文本命令
1.find和grep find命令的作用是在目录中根据文件名搜索文件,grep命令的作用是在目录中根据文件内容搜索文件,find和grep的使用权限是所有用户. (1)find命令: find 列出 ...
- 无线网络RSSI、SSID、BSSID
获取无线网络,及无线网络的参数之前,我们先了解一下RSSI,SSID和BSSID分别是什么,当然你可以去百度或者维基百科查阅,我这里只是简单的说明一下.RSSI就是无线网络的信号强度,这个是和无线AP ...
- Linux C 中 open close read write 使用实例
这里实现的是将文件cody.txt中的内容拷贝到to_cody.txt中去. 1 /* ======================================================== ...
- Redis之SkipList数据结构
0.前言 Redis中有序集合zset需要使用skiplist作为存储数据结构, 关于skiplist数据结构描述可以查询wiki, 本文主要介绍Redis实现的skiplist的细节. 1.数据结构 ...
- Redis之ZSet命令
0.前言 Redis有序集合ZSet可以按分数进行排序, 存储结构可能使用ziplist,skiplist和hash表, zset_max_ziplist_entries和zset_max_zipli ...
- 【从0開始Tornado建站】0.9版本号python站点代码开源--持续更新中
从5月份開始[从0開始Tornado建站]这个专栏,開始一点一点把这个分类兴趣站点弄起来,从无到有的过程也是令人兴奋的:-) 国庆的时候等待备案然后上线,如今站点域名为ustchack ...
- [: ==: unary operator expected 解决方法
之前在写脚本时遇到了这样的错误 “[: ==: unary operator expected” 这是由于做判断的变量值为空导致的. 谷歌出解决方案: 在变量之后加任意字符.例如,要判断变量un是否为 ...