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. UNDO表空间切换步骤

    1.新建UNDO表空间 create undo tablespace UNDOTBS2 datafile '/data01/testdb/undotbs01.dbf' size 1G; alter d ...

  2. std::thread线程库详解(3)

    目录 目录 前言 lock_guard scoped_lock (C++17) unique_lock shared_lock 总结 ref 前言 前两篇的博文分别介绍了标准库里面的线程和锁,这一次的 ...

  3. HTML部分

    1.说一下<label>标签的用法 label标签主要是方便鼠标点击使用,扩大可点击的范围,增强用户操作体验 2.说一下事件代理? 事件委托是指将事件绑定到目标元素的父元素上,利用冒泡机制 ...

  4. 【CentOS7】Apache发布静态网页-超简单

    目前能够提供Web网络服务的程序有 IIS. Nginx和 Apache等.其中,IIS (Internet Information Services,互联网信息服务)是 Windows系统中默认的 ...

  5. Python_1生成器(下)之单线并行--生产着消费者模型

    1 import time 2 def consumer(name): 3 print('%s准备吃包子了!' %name) 4 while True: 5 baozi = yield 6 print ...

  6. Enables DNS lookups on client IP addresses 域名的分层结构

    虚拟域名访问,路由可以到达,但无输出. http://httpd.apache.org/docs/2.2/mod/core.html#hostnamelookups 移动解析 HttpDNS_域名解析 ...

  7. python 招聘数据分析

    导入包 import pandas as pd import numpy as np import matplotlib.pyplot as plt 读文件 df=pd.read_csv(r'C:\U ...

  8. CF 板刷总结

    CF 板刷总结 这件事的开始要从万圣节那一天说起.当然,万圣节只用于描述时间,我显然是不参加任何万圣节活动的对吧. 以下是一些我觉得有必要拿出来讲的,有技术含量的题.会持续更新,断更了记得来催更. C ...

  9. 【Python爬虫】:使用高性能异步多进程爬虫获取豆瓣电影Top250

    在本篇博文当中,将会教会大家如何使用高性能爬虫,快速爬取并解析页面当中的信息.一般情况下,如果我们请求网页的次数太多,每次都要发出一次请求,进行串行执行的话,那么请求将会占用我们大量的时间,这样得不偿 ...

  10. SQL关键字

    不等号(!=,<>) 查询出来的结果集不包含有当前字段为null的数据 <> 是标准的sql语法, 开发中尽量使用<>, 会将字段为null的数据也当做满足不等于的 ...