cs144 lab0 lab1记录
这个叫什么?Write Up吗
lab0
lab0要做的事,实现buffer部分的功能,要自己写变量以及实现接口。
成员函数 write()向buffer内写数据,peek_out() pop_out() read() 函数从buffer内读数据,
buffer长度capacity,需要变量记录向buffer内一共写入和读取过多长的数据。
有些变量在后面的lab会用上,第一次写真不容易想,好些都是参照别人的博客写的。
lab1
// Construct a `StreamReassembler` that will store up to `capacity` bytes.
StreamReassembler(const size_t capacity);
// Receive a substring and write any newly contiguous bytes into the stream,
// while staying within the memory limits of the `capacity`. Bytes that would
// exceed the capacity are silently discarded.
//
// `data`: the substring
// `index` indicates the index (place in sequence) of the first byte in `data`
// `eof`: the last byte of this substring will be the last byte in the entire stream
void push_substring(const string &data, const uint64_t index, const bool eof);
// Access the reassembled ByteStream (your code from Lab 0)
ByteStream &stream_out();
// The number of bytes in the substrings stored but not yet reassembled
size_t unassembled_bytes() const;
// Is the internal state empty (other than the output stream)?
bool empty() const;

push_substring,向buffer内写入data,如“abcdefg”, “cdf” index = 2, eof代表传完这段数据就没有数据要传了。由于buffer有容量限制,收到的数据最后index不能比first_unacceptable大,
对于index在first_unread和first_unassembled之间的部分(已经放进buffer了),直接丢掉,
对于index在first_unassembled和first_unacceptable之间的部分(还没有放进buffer,暂存在map中的),直接丢掉,_head_index用来记录下一个实际要读进buffer的首字符index,例:传“abc”和“bcd”两段字符串,后面。。。
对于何时结束input,开始想的很复杂,其实有两个条件:
1.收到with_eof信号
2.收到的字符串长度如果超过了first_unacceptable,说明还不能结束,还有数据要读
在lab1学会了看测试文件和报错。测试文件放在tests目录下,SubmitSegment 执行push_substring, BytesAssembled 用来测试上一步操作以后nwrite == _bytes, BytesAvailable 执行从buffer内读操作,并判读的数据是不是对的
把收到的数据放进map中有两种思路:以capacity=3为例
1.“abcd”,index=0, 全部读进map中,第二次收到“bcdef”,index=1时,因为第1、2、3位已经在map中(map.find() != map.end()),直接跳过,只读第4位‘f'
2.”abcd“,index=0, 只读_first_unacceptable之前的部分,buffer内为空, 只读"abc" , 'd'丢掉,下次再收到数据”bckef“,index=1时,此时index=3的是’k‘
这两种方法实现以后通过测试案例能发现很多问题,不全记录了,然后一步步debug,一门实验课提供这么丰富的测试案例,爱了爱了。
一个有意思的测试案例,我采用的是第一种思路(我在参考时看到有的博主用第二种思路,应该都可以,仔细debug),但是这时有一个问题:”abcd“, index=0,全部读到map中,又来了一个”bckef”, index=1,如果因为index=3的字符已经读到map中了,’k‘就读不进去了,就在我考虑换成第二种思路的时候,想到做一个判断,如果新的字符不一样,替换掉就好了!!!bingo,问题解决。lab1的案例都通过啦。
ps:第一次做这个lab的时候心想着:啊,不就是计算机网络的代码实现吗,应该不会那么难吧,比较做题家可是把概念什么的都搞得很明白了呢,好吧,naive。然后到处找别人的参考,好家伙,总是有一半以上的案例跑不通,但是也没有想着仔细看代码,就迷迷糊糊的到了lab2,又稀里糊涂的搞完发现一点收获也没有,不纯粹浪费时间吗,一个星期前,从lab0开始重新仔仔细细的脚踏实地的走,通过每一个测试案例都有很多收获,加油!
在博客园记录我在coding中代码与遇到问题的想法和心路。
cs144 lab0 lab1记录的更多相关文章
- 无Xaml的WPF展示
我们创建一个wpf应用程序,我们把里面的xaml文件全部删除,添加一个新类: 如下图: 然后我们cs文件中的代码: using System; using System.Collections.Gen ...
- 【计算机网络】Stanford CS144 Lab Assignments 学习笔记
本文为我的斯坦福计算机网络课的编程实验(Lab Assignments)的学习总结.课程全称:CS 144: Introduction to Computer Networking. 事情发生于我读了 ...
- CS144学习(2)TCP协议实现
Lab1-4 分别是完成一个流重组器,TCP接收端,TCP发送端,TCP连接四个部分,将四个部分组合在一起就是一个完整的TCP端了.之后经过包装就可以进行TCP的接收和发送了. 代码全部在github ...
- 动手学TCP——CS144实验感想
在Stanford CS144的课程实验Lab0~Lab4中,我们动手实现了一个自己的TCP协议,并且能够真的与互联网通信!此外,感谢Stanford开源本实验并提供了大量的优质测试用例,使得我们仅仅 ...
- 6.828 lab1 bootload
MIT6.828 lab1地址:http://pdos.csail.mit.edu/6.828/2014/labs/lab1/ 第一个练习,主要是让我们熟悉汇编,嗯,没什么好说的. Part 1: P ...
- MIT 6.824 lab1:mapreduce
这是 MIT 6.824 课程 lab1 的学习总结,记录我在学习过程中的收获和踩的坑. 我的实验环境是 windows 10,所以对lab的code 做了一些环境上的修改,如果你仅仅对code 感兴 ...
- 清华大学OS操作系统实验lab1练习知识点汇总
lab1知识点汇总 还是有很多问题,但是我觉得我需要在查看更多资料后回来再理解,学这个也学了一周了,看了大量的资料...还是它们自己的80386手册和lab的指导手册觉得最准确,现在我就把这部分知识做 ...
- MIT 操作系统实验 MIT JOS lab1
JOS lab1 首先向MIT还有K&R致敬! 没有非常好的开源环境我不可能拿到这么好的东西. 向每个与我一起交流讨论的programmer致谢!没有道友一起死磕.我也可能会中途放弃. 跟丫死 ...
- 《ucore lab1 exercise5》实验报告
资源 ucore在线实验指导书 我的ucore实验代码 题目:实现函数调用堆栈跟踪函数 我们需要在lab1中完成kdebug.c中函数print_stackframe的实现,可以通过函数print_s ...
随机推荐
- Linux - 文件处理
链接服务器 ssh 使用ssh:ssh -p22 username@host(服务器地址) 输入后会提示输入密码 -p22是ssh默认端口 可以不用 登录之后会默认处于 home 路径 xshell ...
- 针对vue中请求数据对象新添加的属性不能响应式的解决方法
1.需要给对象添加属性时,不能采用传统的obj.属性=值,obj[属性]=值 来添加属性,在vue页面时需要这样使用 this.$set(obj,"propertyName",&q ...
- 前端vue-TinyMCE富文本编辑器表情插件报错解决
最近项目中需要使用文本编辑器,比较了下最终选择了TinyMCE这款富文本编辑器.我安装的是TinyMCE v5但是在使用表情插件的时候,表情一直都出不来,报错信息如下: Uncaught Syntax ...
- 如何使用c#编写单片机程序
因为个人喜爱想研究单片机,但是不太会c,然后再找资料研究有没有其他的方法发现国外的c# nanoframework 框架可以编写单片机程序,本文我将会用自己踩过的坑来总结一些c#编写单片机的一些经 ...
- [luoguP4139]上帝与集合的正确用法
\(\text{Description}\) \(\text{Given a number }p(p\leqslant10^7).\) \(\text{Output }2^{2^{2^{2^{\cdo ...
- Ubuntu安装盘的制作
准备工作 Ubuntu系统镜像 win32diskimager U盘(4G以上),对重要文件提前备份 制作 下载系统镜像 进入官网 我们下载的版本是18.04,不是20.04 在页面中,找到BitTo ...
- 布客·ApacheCN 编程/后端/大数据/人工智能学习资源 2020.6
公告 我们的群共享文件有备份到 IPFS 的计划,具体时间待定. 我们的机器学习群(915394271)正式改名为财务提升群,望悉知. 请关注我们的公众号"ApacheCN",回复 ...
- IDE集成git
目录 简介 Git安装 IDE集成Git IDE集成Git代码的创建分享上传 代码的下载和普通上传 分子的创建以及合并 代码的回滚 查看历史版本 简介 Git 是一个开源的分布式版本控制软件,用以有效 ...
- JavaScript多元运算符
JavaScript多元运算符 JavaScript多元运算符 **实例:**` function test(9){ var a=4,b=11; return p > 1 ? p<b ...
- 出现Table ‘./mysql/proc’ is marked as crashed and should be repaired
一般这种表崩溃的问题出现在mysql异常停止,或者使用kill -9命令强行杀掉进程导致,进入MySQL命令行后,执行下面的命令即可修复'./mysql/proc'表 repair table mys ...