CS144-实验环境搭建和Lab0

实验环境

  1. 这次打算用 Jetbrains Gateway进行远程开发。按照 CS144 README 进行远端Clion的配置。注意环境变量和编译时传给cmake的宏的设置。
  2. 安装TcpDump,最好从Github的源码编译安装,5.0版本后的tcpdump可以保存pcap文件中同时输出到标准输出流中。

实验0

使用TCPsocket和一个webserver(对端监听80端口)进行通信,类似于curl。

代码十分简单,按照socket通信流程编写即可。lab0仅完成下图中描述的TCP客户端流程即可

图片来源微信公众号Linux fd 系列 — socket fd 是什么?

下面给出我的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void get_URL(const string &host, const string &path) {
// Your code here.

// You will need to connect to the "http" service on
// the computer whose name is in the "host" string,
// then request the URL path given in the "path" string.
TCPSocket sock{};
sock.connect(Address(host, "http"));
string input_str("GET " + path + " HTTP/1.1\r\nHost: " + host + "\r\n\r\n");
sock.write(input_str);

// Then you'll need to print out everything the server sends back,
// (not just one call to read() -- everything) until you reach
// the "eof" (end of file).
sock.shutdown(SHUT_WR);
while (!sock.eof())
cout << sock.read();
sock.close();
// cerr << "Function called: get_URL(" << host << ", " << path << ").\n";
// cerr << "Warning: get_URL() has not been implemented yet.\n";
}

测试

  1. 如果使用Clion的话,需要先build All Test,再运行相关测试。测试的那些target只运行测试不进行编译链接

  2. 进行抓包测试。 我的客户端是先半关闭,再一点点读对端发来的数据。抓到的包也反映了这一点

    如果使用5.0版本的tcpdump的话,可以使用–print参数。否则只能先保存,再查看。

1
sudo tcpdump  -i any -ent host cs144.keithw.org -w ./pcap/lab0.pcap

这里使用了Vscode Crumbs插件用来在Vscode中看pcap包

附:CS144代码风格

CS144 使用 C++11 标准完成实验,它对C++代码的风格有着严格的限制:

  • 使用 Resource acquisition is initialization 风格,即 RAII 风格。

  • 禁止使用 malloc 和 free 函数

  • 禁止使用 new 和 delete 关键字

  • 禁止使用原生指针(*)。若有必要,最好使用智能指针(unique_ptr等等)。(该实验没有必要用到指针)。

  • 禁止使用模板、线程相关、各类锁机制以及虚函数

  • 禁止使用 C 风格字符串(char*) 以及 C 风格字符串处理函数。使用 string 来代替。

  • 禁止使用 C 风格强制类型转换。若有必要请使用 static_cast

  • 传递参数给函数时,请使用常量引用类型(const Ty& t)

  • 尽可能将每个变量和函数方法都声明成 const

  • 禁止使用全局变量,以及尽可能让每个变量的作用域最小

  • 在完成代码后,务必使用 make format 来标准化代码风格。


CS144-实验环境搭建和Lab0
https://gwzlchn.github.io/202205/cs144-lab0/
作者
Zelin Wang
发布于
2022年5月18日
更新于
2022年10月23日
许可协议