cs144|cs144 lab0 lab1记录

这个叫什么?Write Up吗
lab0
【cs144|cs144 lab0 lab1记录】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;

cs144|cs144 lab0 lab1记录
文章图片


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中代码与遇到问题的想法和心路。

    推荐阅读