CS144的实验就是要实现一个用户态TCP协议,对于提升C++的水平以及更加深入学习计算机网络还是有很大帮助的。

第一个Lab是环境配置和热身,环境按照文档里的配置就行了,前面两个小实验就是按照步骤来的,就不细讲了。

Writing webget

这一个实验是要用他封装好的socket库写一个简单的http客户端。看看文档里AddressTCPSocket类的介绍就行了。

void get_URL(const string &host, const string &path) {
TCPSocket sock;
sock.connect(Address(host, "http"));
sock.write("GET " + path + " HTTP/1.1\r\n");
sock.write("Host: " + host + "\r\n");
sock.write("Connection: close \r\n");
sock.write("\r\n"); while(!sock.eof()){
auto rsp = sock.read();
cout << rsp;
}
sock.close();
}

注意就是输出的时候要原封不动地输出内容,也不能任何内容(包括回车),不然会通过不了检查。

An in-memory reliable byte stream

这一个就是要实现一个循环缓冲区ByteStream,并实现一系列的函数实现对其的读写等操作。我这里底层是使用vector来实现。

class ByteStream {
private:
std::vector<char> buffer;
size_t head = 0;
size_t tail = 0;
size_t length = 0;
size_t cap = 0;
size_t total_read = 0;
size_t total_write = 0;
bool end = false; bool _error{}; //!< Flag indicating that the stream suffered an error.
...
} ByteStream::ByteStream(const size_t capacity) : buffer(capacity), cap(capacity) {} size_t ByteStream::write(const string &data) {
size_t wlen;
if(data.length() > cap - length){
wlen = cap - length;
}else{
wlen = data.length();
}
for(size_t i = 0; i < wlen; i++){
buffer[tail] = data[i];
tail = (tail + 1) % cap;
}
length += wlen;
total_write += wlen;
return wlen;
} //! \param[in] len bytes will be copied from the output side of the buffer
string ByteStream::peek_output(const size_t len) const {
size_t rlen;
if(len > length){
rlen = length;
}else{
rlen = len;
}
string res(rlen, 0);
size_t p = head;
for(size_t i = 0; i < rlen; i++){
res[i] = buffer[p];
p = (p + 1) % cap;
}
return res;
} //! \param[in] len bytes will be removed from the output side of the buffer
void ByteStream::pop_output(const size_t len) {
if(len > length){
length = 0;
head = this->tail;
total_read += length;
}else{
length -= len;
head = (head + len) % cap;
total_read += len;
}
} //! Read (i.e., copy and then pop) the next "len" bytes of the stream
//! \param[in] len bytes will be popped and returned
//! \returns a string
std::string ByteStream::read(const size_t len) {
string res = peek_output(len);
pop_output(len);
return res;
} void ByteStream::end_input() {
end = true;
} bool ByteStream::input_ended() const {
return end;
} size_t ByteStream::buffer_size() const {
return length;
} bool ByteStream::buffer_empty() const {
// cout << len << endl;
return length == 0;
} bool ByteStream::eof() const {
return end && length == 0;
} size_t ByteStream::bytes_written() const {
return total_write;
} size_t ByteStream::bytes_read() const {
return total_read;
} size_t ByteStream::remaining_capacity() const {
return cap - length;
}

整个实现还是很简单的,就是记得判断一下输入的len是否超出了限制就行了。

CS144学习(1)Lab 0: networking warmup的更多相关文章

  1. 嵌入式Linux学习笔记(0)基础命令。——Arvin

    学习记录: 到今天为止ARM裸机开发学习进程:1.2.1-1.2.14 预科班知识Linux介绍学习进程:0.2.1-0.2.6 学习内容笔记: 学习了Linux的开发方式的优劣介绍 学习了常用文件夹 ...

  2. Find security bugs学习笔记V1.0

    Find security bugs学习笔记V1.0 http://www.docin.com/p-779309481.html

  3. PHP代码安全学习笔记V1.0

    PHP代码安全学习笔记V1.0http://www.docin.com/p-778369487.html

  4. Java安全防御学习笔记V1.0

    Java安全防御学习笔记V1.0http://www.docin.com/p-766808938.html

  5. Common Lisp学习笔记(0):从SLIME开始 | 优哉·幽斋

    Common Lisp学习笔记(0):从SLIME开始 | 优哉·幽斋 Common Lisp学习笔记(0):从SLIME开始

  6. [swarthmore cs75] Lab 0 Warmup & Basic OCaml

    课程回顾 Swarthmore学院16年开的编译系统课,总共10次大作业.本随笔记录了相关的课堂笔记以及第1次大作业. 什么是编译 编译就是执行Program->Program'转换的过程,如下 ...

  7. Kubernetes入门学习--在Ubuntu16.0.4安装配置Minikube

    目 录 一. 安装minikube环境 1.1. 安装前准备 1.2. 安装Lantern 1.2.1. Lantern下载网站 1.2.2. Lantern下载地址 1.2.3. Lantern安装 ...

  8. 淘宝网触屏版 - 学习笔记(0 - 关于dpr)

    注:本文是学习笔记,并不是教程,所以会有很多我不理解或猜测的问题,也会有不尽详实之处,望见谅. 对于pc端网页设计师来说,移动端的网页制作,我之前只是简单的加了一个 <meta name=&qu ...

  9. 学习OpenStack之 (0):基础知识

    vi 方向键出现字母问题解决方法 执行命令 sudo apt-get remove vim-common 执行命令 sudo apt-get install vim 鼠标被virtualbox捕获无法 ...

随机推荐

  1. [java]文件上传下载删除与图片预览

    图片预览 @GetMapping("/image") @ResponseBody public Result image(@RequestParam("imageName ...

  2. 特斯拉Toolbox诊断检测仪工具Tesla诊断电脑 Tesla Toolbox

    Tesla特斯拉Toolbox诊断工具Tesla诊断电脑检测仪 Tesla Toolbox, Tesla Toolbox Diagnostic Tester.Language: English,Deu ...

  3. Ubuntu创建桌面图标

    以火狐为例 创建"~/.local/share/applications/firefox_dev.desktop"文件, 文件内容为: [Desktop Entry] Name=F ...

  4. TCP三次握手Linux源码解析

    TCP是面向连接的协议.面向连接的传输层协议在原点和重点之间建立了一条虚拟路径,同属于一个报文的所有报文段都沿着这条虚拟路径发送,为整个报文使用一条虚拟路径能够更容易地实施确认过程以及对损伤或者丢失报 ...

  5. 在nodejs中创建child process

    目录 简介 child process 异步创建进程 同步创建进程 在nodejs中创建child process 简介 nodejs的main event loop是单线程的,nodejs本身也维护 ...

  6. 如何创建一个Java项目

    目录 新建项目 项目信息配置 创建Java类 编译和运行 新建项目 首先双击eclipse进入到eclipse页面. 菜单"File"下的"New"里" ...

  7. LVM 逻辑卷扩容

    当lv空间不够用时,就需要我们对lv进行的扩容. 扩容分两种情况:(lv的有点,支持在线扩容) VG有充足的空间,可直接对LV进行扩容: VG空间不足,需要先对VG进行扩容,然后再对LV进行扩容 这里 ...

  8. 03. struts2中Action配置的各项默认值

    Action中的各项默认值 Action各项配置 <action name="helloworld" class="com.liuyong666.action.He ...

  9. 在OpenDaylight controller上开发App

    安装环境:Ubuntu18.04 一.安装依赖 1. 安装JDK: sudo apt update sudo apt install openjdk-8-jdk-headless 选择默认的 JDK: ...

  10. windows10复制粘贴键突然失效无法复制粘贴的最简单办法

    报了学习班,打开了VCE的加密文档 今天复制粘贴键突然失效 在网上捣鼓了好多方法都不行最后发现看看你有没有在用加密文件,也就是网课类的文档和视频.有就把它关了关了就好了