CS144学习(1)Lab 0: networking warmup
CS144的实验就是要实现一个用户态TCP协议,对于提升C++的水平以及更加深入学习计算机网络还是有很大帮助的。
第一个Lab是环境配置和热身,环境按照文档里的配置就行了,前面两个小实验就是按照步骤来的,就不细讲了。
Writing webget
这一个实验是要用他封装好的socket库写一个简单的http客户端。看看文档里Address
和TCPSocket
类的介绍就行了。
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的更多相关文章
- 嵌入式Linux学习笔记(0)基础命令。——Arvin
学习记录: 到今天为止ARM裸机开发学习进程:1.2.1-1.2.14 预科班知识Linux介绍学习进程:0.2.1-0.2.6 学习内容笔记: 学习了Linux的开发方式的优劣介绍 学习了常用文件夹 ...
- Find security bugs学习笔记V1.0
Find security bugs学习笔记V1.0 http://www.docin.com/p-779309481.html
- PHP代码安全学习笔记V1.0
PHP代码安全学习笔记V1.0http://www.docin.com/p-778369487.html
- Java安全防御学习笔记V1.0
Java安全防御学习笔记V1.0http://www.docin.com/p-766808938.html
- Common Lisp学习笔记(0):从SLIME开始 | 优哉·幽斋
Common Lisp学习笔记(0):从SLIME开始 | 优哉·幽斋 Common Lisp学习笔记(0):从SLIME开始
- [swarthmore cs75] Lab 0 Warmup & Basic OCaml
课程回顾 Swarthmore学院16年开的编译系统课,总共10次大作业.本随笔记录了相关的课堂笔记以及第1次大作业. 什么是编译 编译就是执行Program->Program'转换的过程,如下 ...
- Kubernetes入门学习--在Ubuntu16.0.4安装配置Minikube
目 录 一. 安装minikube环境 1.1. 安装前准备 1.2. 安装Lantern 1.2.1. Lantern下载网站 1.2.2. Lantern下载地址 1.2.3. Lantern安装 ...
- 淘宝网触屏版 - 学习笔记(0 - 关于dpr)
注:本文是学习笔记,并不是教程,所以会有很多我不理解或猜测的问题,也会有不尽详实之处,望见谅. 对于pc端网页设计师来说,移动端的网页制作,我之前只是简单的加了一个 <meta name=&qu ...
- 学习OpenStack之 (0):基础知识
vi 方向键出现字母问题解决方法 执行命令 sudo apt-get remove vim-common 执行命令 sudo apt-get install vim 鼠标被virtualbox捕获无法 ...
随机推荐
- Poj-P2533题解【动态规划】
本文为原创,转载请注明:http://www.cnblogs.com/kylewilson/ 题目出处: http://poj.org/problem?id=2533 题目描述: 如果ai1 < ...
- Centos7 虚拟机优化
配置yum源 rm -f /etc/yum.repos.d/* curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/ ...
- Obligations for calling close() on the iterable returned by a WSGI application
Graham Dumpleton: Obligations for calling close() on the iterable returned by a WSGI application. ht ...
- 洛谷P3833
Description 树链剖分板子题 考查两种操作 A u v w 把 u 节点到 v 节点路径上所有节点权值加 w Q u 求以 u 为根节点的子树权值之和 首先需要了解线段树和 dfs 序,我这 ...
- LOJ10145郁闷的出纳员
传送门:https://loj.ac/problem/10145 简单的平衡树 ------------------------------------ 1 #include<bits/stdc ...
- PowerApps画布应用编码规范 和指南
花了一番功夫把PowerApps编码最佳实践的官方白皮书本地化了一下,顺便对部分产品变更做了校对和注释,欢迎大家查阅和分享. 从我实际的项目实施经验来讲,内容还是值得一读,可以帮助项目更好维护和管理. ...
- vmware安装linux系统,自动建立没选项
虚拟机安装CentOS自己跳过分区,直接就到最后的软件包安装了 建完系统后不用power on,建完后在edit一下系统参数,应该会看见两个cd, 有一个是vmware自己加的,把那个删除后在开机就可 ...
- RabbitMQ (简单集群部署操作)
RabbitMQ 集群部署 前期准备 第一步:三台linux系统(centos7.3) 主机名(hostname) 网卡ip node1 192.168.137.138 node2 192.168.1 ...
- IP路由__动态路由
1.使用协议来查找网络并更新路由表的配置,就是动态路由.它比使用静态或默认路由方便,但它需要一定的路由器CPU处理时间和网络链接带宽.路由协议定义了路由器与相邻路由器通信时所使用的一组规则. 在互联网 ...
- Cisco的互联网络操作系统IOS和安全设备管理器SDM__CDP
1.CDP定时器和保持信息时间:通过show cdp 命令查看 show cdp neighbors命令提供下列信息:device ID(设备ID).local interface(本地接口).hol ...