开始跟CS144,这门课的lab很有意思,在博客里面记录。
Fetch a Web Page
- 在浏览器地址栏键入http://cs144.keithw.org/hello敲击回车,看到屏幕显示如下的字符:
1 | Hello, CS144! |
- 下面用命令行去做和浏览器一样的事情,获取同样的内容。
键入telnet cs144.keithw.org http,敲击回车,建立一个可靠的字节流,显示如下:
1 | Trying 104.196.238.229... |
键入GET /hello HTTP/1.1敲击回车,确认子路径。
键入Host: cs144.keithw.org敲击回车,确认host path。
键入Connection: Close敲击回车,关闭连接。
最后再敲击一次回车,结束HTTP请求。
屏幕上显示如下:
1 | GET /hello HTTP/1.1 |
- Assignment
键入:
1 | cs144.keithw.org http |
显示:
1 | aa@desk:~$ telnet cs144.keithw.org http |
X-Your-Code-Is: 208907
监听和连接
- 输入netcat -v -l -p 9090,开启一个server,开始监听。
1 | aa@desk:~$ netcat -v -l -p 9090 |
- 在另一个terminal输入:
1 | aa@desk:~$ telnet localhost 9090 |
开启一个client,去连接localhost:9090
这时前一个terminal有如下输出:
1 | Connection received on localhost 7012 |
即前一个terminal的server(netcat)被来自localhost:7012的client(telnet)程序连接。
- 在server随便键入一些东西:
1 | hello, world! |
在client都可以显示出来。
反过来也是。
- 在server键入 Ctrl-C,这样这个连接就关闭了。但是在client键入Ctrl-C就没用。
Write a network program using an OS socket
实验目的
用操作系统预先定义好的对TCP的支持,实现一个webget程序,该程序创建TCP stream socket,然后连接到Web Server,最后获取页面内容。
实验条件
操作系统:Ubuntu 20.04
现有代码见链接,按照说明文档编译。
编码要求
- 善用cpp文档和指南
- 避免使用malloc/free和new/delete这样的“成对”的操作,这样做是为了避免后面一个操作不会发生,例如在throw一个exception的情况下。应当使用的是在构造函数和析构函数里面完成成对的操作。这种编码风格叫“Resource acquisition is initialization”,RAII,即“资源获取就是初始化”。
- 原则上不用原始指针,即“*”,只在有必要的时候用智能指针,如unique_ptr或者shared_ptr。
- 避免使用templete、线程、锁、虚函数。
- 避免C风格的字符串,即“char* str”,如果有必要用的话使用C++的static_cast。
- 用const的引用传递函数参数。
- 除非变量需要变化,否则用const类型的变量。
- 让每个方法都const,除非需要改变对象。
- 避免全局变量,让每个变量具有最小的作用域。
- 在提交该作业之前,运行make format统一代码风格。
- 用git管理,用频繁的小的commit,每次commit说明改动情况及原因。每次commit应该通过更多的测试样例。小的改动有助于debug,也有助于防作弊。自己的git记得用private。
- 仔细阅读sponge文档,和libsponge/util目录下的头文件file descriptor.hh, socket.hh, address.hh。
思路
Linux提供了基于IP的服务,sponge提供了面向TCP的socket,所以这里用TPCSocket就可以了,需要传递的字符串和之前的一样。读取的时候用TCPSocket::eof()判断是否文件结尾,打印所有接收到的字符。最后有10行左右的代码。
代码
下面列出get_URL()中涉及到上述任务的代码。
1 | TCPSocket tcpsocket; |
结果:
1 | aa@desk:/mnt/c/Users/admin/Desktop/CS144/lab0/sponge/build$ ./apps/webget cs144.keithw.org /hello |
通过了嘻嘻
1 | aa@desk:/mnt/c/Users/admin/Desktop/CS144/lab0/sponge/build$ make check_webget |
An in-memory reliable byte stream
实验目的
在内存里面模拟一个TCP连接,实现提供这些功能的接口。
实验要求
- 遇到EOF的时候结束。
- 处理字节流的容器大小受限,满了之后必须读取才能写入。
- 需要能处理很长很长的字节流。
- 本实验是在内存里面模拟。后面的实验可能就不是在内存里面模拟,而是在不可靠的IP层上进行。
代码
这里用deque实现字节流,也可以用string。指向字节流的指针用的是unique_ptr。
吐槽:真的离谱,通过t_webget和t_address_dt需要搭梯子,通过t_socket_dt不能用win10自带的ubuntu。
1 | ByteStream::ByteStream(const size_t capacity): |
通过了
1 | cs144@cs144vm:/media/sf_share/sponge/build$ make check_lab0 |