ICS proxy lab总结

来源:互联网 发布:java写游戏代码 编辑:程序博客网 时间:2024/04/30 06:34

ICS proxy lab总结

非常遗憾,由于我动手过于匆忙,做的太过于粗放,功能过于简陋,加上不太会调试,加上懒得调试。所以这个服务器写完以后不能访问真实网页。为什么课程每次重头戏的lab,比如电路实验的收音机和ics的代理都会失败呢?我需要好好反思一下:-(


lab要求

这个lab要求实现一个基于线程的并发缓存代理,支持比较简单的功能即可。


lab实现

lab实现无非是给每一个客户端一个独立线程处理,链接,读取请求,从缓存中要请求,如果没有则发送到服务器,读取服务器回应,缓存,并发回。

1.proxy基本框架

基本框架从实现中可以看清楚,比较清晰。虽然弄清楚这个框架本身要费很大力气,但是一旦弄清楚来就不是很大的问题。

2.同步和线程安全

最常见的问题是线程间安全,这个我在细节中会阐述一下,课本里也有很好的解决方案。

3.缓存

缓存最简单的LRU就可以了,而且直接全组相连就好了。但是缓存一个困难的问题在于缓存操作暗含一个读者写着问题(虽然由于测试数据太弱不考虑这个问题隐含不安全也能过…),所以最好确信弄清楚读者写着问题再做,或者确信会使用书中的解答再说。


调试

调试非常困难,最主要困难是不能像其他lab一样简单地printf()就好了,所以调试只能要么用真实的浏览器挂代理,要么用writeup工具,要么输出到文件里自己看。


一些细节

这个lab细节还是很繁琐的,我列举了常见的容易出错的细节

1.缓存错对象

我本来以为缓存对象很好确定,把要Rio_write()的对象缓存一遍就好了,结果不小心多缓存了一个头部,出错。

2.字符串处理错误

很低级的错误,因为调试困难所以很难发现。
而且事实上有些错误我也不知道原因,比如我遇到过read,write读写buf,设定大小为strlen(buf)就出错,设为一个很大的默认值就对了,也不知道为什么。
找到原因了,因为有一个图片所以不能按字符串格式处理,所以正确方法是记录read的大小并write

3.没有避免线程间竞争

这个比较常见,但是看过书里的竞争以后应该不会犯了。

4.缓存读写没有加互斥锁

这个也比较常见,但是看过书里读写者问题就不会错了。

5.空间大小预设不得当出错

这个错误困扰了我好久,没想到测试数据那么大。

0 0
原创粉丝点击