【CS144】Lab1总结

Lab汇总

概述

lab1要求实现一个字符串的装配器,用于将 T C P TCP TCP接收方接收到的字节流拼接起来,并缓存一定量的乱序到达的字节,便于 T C P TCP TCP接收方相关功能的实现。

具体实现

该装配器实现的重点是push_substring函数,它接收一个字符串 d a t a data data与该字符串首字符在原串中的偏移量(由于 T C P TCP TCP传输时可能需要将较大的报文按照 M S S MSS MSS进行切分),并维护一个已拼接完的字节流(使用lab0实现的ByteStream类维护)方便 T C P TCP TCP接收方读取
由于输入的字符串可能无序且可能有重叠部分,需要按字节顺序连续地将字节流添加进字节流中,且不能保存重叠的部分;且已拼接完的字节流大小与乱序字节缓存区的大小之和不能超过给定的capacity,到达的字节如果在给定的范围之外,则忽略。
在这里插入图片描述

图片来源于lab文档

我使用一个链表维护乱序到达的字节序列,使用两个变量标志该字节流是否已经到达尾部与字节流最后一个字节的序号。

bool _eof;
size_t _eof_idx;

对于链表的维护,我首先将乱序到达的字节序列(输入的字符串)插入到链表中(按照index排序的插入),然后再对链表进行相邻序列的合并,使得链表中的相邻两项在字节流上不相邻。
当到达一个可以加入字节流的序列时,遍历链表并将链表第一个节点与当前的字节流前沿对比,如果有相交或者相邻,则把第一个节点删除并将对应的字节序列加入字节流中,否则停止迭代。

有一些细节需要注意

  • 首先就是该函数接收的字符串可能是空串,这时要特判一下,空串会导致后面的处理变复杂,如果携带eof则设置参数,然后返回即可。
  • 还有就是如果输入的字符串不为空,则需要判断一下该字节序列的范围是否超过当前的缓存范围(从接收窗口后沿算起往后的capacity个字节),如果超过,则可以先切割一下输入的字符串。(超过范围的字节被省略)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值