前言
经过6.006的洗礼,本菜鸡终于开始了所谓八股文的学习。在确定学习顺序时,最终按照面试考察频率敲定为:计算机网络 -> 计算机原理 -> 操作系统 -> 分布式系统 -> CSAPP. 作为第一门课的计算机网络,在选取课程时经过比较,最后选取了 Stanford 的 CS144. 选择该课程的原因也很简单:CS144 的 Assignments 将用 C++ 徒手构建出一套 TCP 出来。这对于日常十分枯燥的计算机网络课程来说可谓是添加了不少乐(ma)趣(fan)。
截止到本文时,本人已经完成了前两个 Assignments. 完成后的最大感受就是:1. 动手实现对于计算机网络课程来说确实十分重要;2. CS144 的作业当中很多地方要求并未明确给出,需要参考测试用例以确定具体要求(准确来说应当是询问同学/助教,不过对于自学者来说只能参考测试用例或者参考网上已经完成的solution —— 这里十分感谢 Kiprey 大佬的支持!)。
Specifications
Lab 0 当中我们需要完成:1. 基于现成接口的 TCP 连接程序,对应 webget.cc
;2. 基于本机内存的字节流接口。
实验本身比较简单,在此仅将完成过程中的一些注意点列出。
input_ended 和 eof 的区别
在刚开始实现时,对于这两个状态函数本人的认识不够深入,以至于不能辨别这两个接口分别应该承担怎样的分工。在参考他人已有的实现之后,反应过来:当不再有新数据到来时即为 input_ended,此时 buffer 不一定为 empty。也即 input_ended 仅为一个 flag,并不代表着 eof; 而 eof 则代表着目标发送的所有字节数据全被读取完毕,显然 eof 的条件为,(input_ended == True) && (buffer_empty == True)
.
数据结构的选择
在实现 ByteStream
类时,需要确定合适的数据结构来存储尚未读取但已经接收到的信息。虽然在行为上最适合的是 queue<char>
, 但由于 STL 自带的 queue 没有连续 peek 多个元素的功能,因此无法使用 queue
作为存储结构。
作为可选项,deque<char>
, vector<char>
以及 string
均可用来进行存储。其中 deque
在插入和删除方面的性能要优于 vector
(Referenced by GeeksforGeeks). 而对于 deque<char>
和 string
的选择,则可以参考 vector<char>
和 string
的选择。简单来说,如果是需要存储文本(text),则使用 string
更适合;如果是类似于统计不同字符的次数等场景,则使用 vector<char>
更适合。
总结:在实际应用当中,需要根据实际需求选定合适的数据结构来储存数据。而如何确定则需要长久的锻炼。