CS144 Lab Checkpoint 0: networking warm up
Set up GNU/Linux on your computer
我用的是Ubuntu,按照指导书上写的输入如下命令安装所需的软件包:
sudo apt update && sudo apt install git cmake gdb build-essential clang \
clang-tidy clang-format gcc-doc pkg-config glibc-doc tcpdump tshark
Networking by hand
主要任务包括:检索网页和发送电子邮件,这两者都依赖一种可靠的双向字节流。
Fetch a Web page
没有账号密码,所以这部分只做记录。
Telnet是一种应用层协议,使用于互联网及局域网中,使用虚拟终端的形式,提供双向、以文字字符串为主的命令行接口交互功能。
HTTP协议(Hyper Text Transfer Trotocol)从万维网传输超文本到本地浏览器的传送协议。
telnet cs144.keithw.org http
建立连接
HTTP协议的GET请求,从指定的资源请求数据。
GET /hello HTTP/1.1
告诉服务器请求资源的URL
Host: cs144.keithw.org
告诉服务器URL的主机部分
Connection: close
关闭连接。
Send yourself an email
简单邮件发送协议(英语:SimpleMailTransferProtocol,缩写:SMTP)可用在发送和接收电子邮件的信息,但SMTP通常用作发送电子邮件信息,而不是接收。
telnet 148.163.153.234 smtp
Listening and connecting
netcat用于任意 TCP 与 UDP 连接和侦听:
-v 选项表示“verbose mode”(详细模式)
-l 选项表示“listen mode”(监听模式)。
-p 选项表示“port”或“local port”(本地端口)。
netcat -v -l -p 9090
Writing a network program using an OS stream socket
目标:使用Linux以及大多数其他操作系统都提供的功能:创建双向字节流、一个在自己的主机上运行,另一个在Internet的另一台主机上运行。
这个特性被叫做流套接字,但是Internet并不提供可靠的字节流服务,Internet做的唯一事情就是尽最大努力将数据报文发送到目的地。
本实验要实现一个名为“webget”的程序,创建一个TCP流套接字,连接到Web服务器并获取页面。
Let’s get started—fetching and building the starter code
这里的编译需要注意C++用的是C++20,我的默认C++是17会报错。
cmake -S .-B build #-S指定源代码目录 -B指定生成目录
cmake --build build # --build指定构建目录
Modern C++: mostly safe but still fast and low-level
- 不使用
malloc()和free(); - 不使用new和delete;
- 不要使用裸指针,必要的时候使用智能指针
unique_ptr或者shared_ptr; - 避免使用模板、线程、锁和虚函数;
- 避免使用C风格的字符串,使用std::string;
- 避免使用C风格的强制转换,如果必须使用,使用C++的
static_cast; - 最好使用const引用传递参数 e.g.:const Address & address;
- 使每个变量都变const,除非它能被改变;
- 使每个函数都变const,除非它需要改变对象;
- 避免使用全局变量,让每个变量尽可能小的作用域;
Writing webget
实验指导书里说要用到TCPSocket和Address 类
Hint:
在HTTP中每行必须是以\r\n结尾。
在客户端请求包含"Connection: close",当客户端读取来自服务器端的"EOF",这表示服务器端已经回复完成。
确保读取并打印服务器的所有输出,直到套接字到达“EOF”(文件末尾),一次read调用是不够的。
大约十行代码。
lab0用到的函数在下面的网站都能查到。
官方文档
void get_URL( const string& host, const string& path )
{cerr << "Function called: get_URL(" << host << ", " << path << ")\n";// cerr << "Warning: get_URL() has not been implemented yet.\n";// 创建TCPSocketTCPSocket sock;sock.connect( Address( host, "http" ) );// 构造 HTTP GET 请求string request = "GET " + path + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n";sock.write( request );// 接收响应string res;while ( !sock.eof() ) {sock.read( res );cout << res;}sock.close();
}
在根目录下输入cmake --build build --target check_webget
结果如下:

An in-memory reliable byte stream
实验要求:
- 字节在输入端写入,并以相同顺序在输出端被读取;字节流是有限的,writer可以停止写入,reader在读到EOF后不再读入。
- 字节流需要流控制,容量将限制writer能够在给定时刻最多写入的数据量,当reader读取数据时,writer可以写的更多。(所以网上很多方案选择双端队列解决,当然deque可能会造成更大的内存开销,姑且这么实现)。
byte_stream.hh
class ByteStream
{
public:explicit ByteStream( uint64_t capacity );// Helper functions (provided) to access the ByteStream's Reader and Writer interfacesReader& reader();const Reader& reader() const;Writer& writer();const Writer& writer() const;void set_error() { error_ = true; }; // Signal that the stream suffered an error.bool has_error() const { return error_; }; // Has the stream had an error?protected:// Please add any additional state to the ByteStream here, and not to the Writer and Reader interfaces.uint64_t capacity_;bool error_ {};// my code herebool closed = false;uint64_t total_bytes_pushed = 0;uint64_t total_bytes_poped = 0;std::deque<char> buffer = {};
};
byte_stream.cc
#include "byte_stream.hh"using namespace std;ByteStream::ByteStream( uint64_t capacity ) : capacity_( capacity ) {}
// 返回stream是否关闭
bool Writer::is_closed() const
{// Has the stream been closed?// Your code here.return closed;
}
// Writer将数据放入stream中
void Writer::push( string data )
{// Your code here.// (void)data;uint64_t len = data.length();if ( len > capacity_ - buffer.size() ) {len = capacity_ - buffer.size();}for ( uint64_t i = 0; i < len; ++i ) {buffer.push_back( data[i] );total_bytes_pushed++;}return;
}
// 关闭stream
void Writer::close()
{closed = true;// Your code here.
}
// 返回capacity - 已经用过的stream大小
uint64_t Writer::available_capacity() const
{// Your code here.return capacity_ - buffer.size();
}
// 返回总的push进stream的字节数
uint64_t Writer::bytes_pushed() const
{// Your code here.return total_bytes_pushed;
}// 返回stream是否关闭或者pop完所有的元素
bool Reader::is_finished() const
{// Your code here.return closed && buffer.empty();
}
// 返回总的pop的stream的字节数
uint64_t Reader::bytes_popped() const
{// Your code here.return total_bytes_poped;
}
// Peek at the next bytes in the buffer
// string_view: C++ 17引入,在不拷贝的情况下读取、查看和操作字符串
// peek函数作用:
string_view Reader::peek() const
{// Your code here.if ( !buffer.empty() ) {return std::string_view( &buffer.front(), 1 ); // 返回deque的front元素的string_view}return std::string_view(); // 返回一个默认构造的string_view(空的)
}
//
void Reader::pop( uint64_t len )
{// Your code here.if ( buffer.size() < len ) {len = buffer.size();}for ( uint64_t i = 0; i < len; ++i ) {buffer.pop_front();total_bytes_poped++;}
}
// Number of bytes currently buffered (pushed and not popped)
uint64_t Reader::bytes_buffered() const
{// Your code here.return buffer.size();
}
运行结果:

相关文章:
CS144 Lab Checkpoint 0: networking warm up
Set up GNU/Linux on your computer 我用的是Ubuntu,按照指导书上写的输入如下命令安装所需的软件包: sudo apt update && sudo apt install git cmake gdb build-essential clang \ clang-tidy clang-format gcc-doc pkg-config glibc-doc tc…...
靶场之路-VulnHub-DC-6 nmap提权、kali爆破、shell反连
靶场之路-VulnHub-DC-6 一、信息收集 1、扫描靶机ip 2、指纹扫描 这里扫的我有点懵,这里只有两个端口,感觉是要扫扫目录了 nmap -sS -sV 192.168.122.128 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.4p1 Debian 10deb9u6 (protoc…...
给没有登录认证的web应用添加登录认证(openresty lua实现)
这阵子不是deepseek火么?我也折腾了下本地部署,ollama、vllm、llama.cpp都弄了下,webui也用了几个,发现nextjs-ollama-llm-ui小巧方便,挺适合个人使用的。如果放在网上供多人使用的话,得接入登录认证才好&a…...
3月5日作业
代码作业: #!/bin/bash# 清空目录函数 safe_clear_dir() {local dir"$1"local name"$2"if [ -d "$dir" ]; thenwhile true; doread -p "检测到 $name 目录已存在,请选择操作: 1) 清空目录内容 2) 保留目…...
【MySQL】增删改查
目录 一、新增(Create) 单行数据 全列插入 多行数据 指定列插入 插入时间 二、查询(Retrieve) 全列查询 指定列查询 查询字段为表达式 别名 去重:DISTINCT 排序:ORDER BY 条件查询࿱…...
【三维生成】StarGen:基于视频扩散模型的可扩展的时空自回归场景生成
标题:《StarGen: A Spatiotemporal Autoregression Framework with Video Diffusion Model for Scalable and Controllable Scene Generation》 项目:https://zju3dv.github.io/StarGen 来源:商汤科技、浙大CAD、Tetras.AI 文章目录 摘要一、…...
线反转法实现矩形键盘按键识别
由于行、列线为多键共用,各按键彼此将相互发 生影响,必须将行、列线信号配合起来并作适当的处 理,才能确定闭合键的位置。 线反转法 第1步:列线输出为全低电平,则行线中电平由高变低 的所在行为按键所在行。 第2步&…...
在 Element Plus 的 <el-select> 组件中,如果需要将 <el-option> 的默认值设置为 null。 用于枚举传值
文章目录 引言轻松实现 `<el-option>` 的默认值为 `null`I 实现方式监听清空事件 【推荐】使用 v-model 绑定 null添加一个值为 null 的选项处理 null 值的显示引言 背景:接口签名规则要求空串参与,空对象不参与签名计算 // 空字符串“” 参与签名组串,null不参与签…...
大白话面试中应对自我介绍
在面试中,自我介绍是开场的关键环节,它就像你递给面试官的一张“个人名片”,要让面试官快速了解你并对你产生兴趣。下面详细讲讲应对自我介绍的要点及回答范例。 一、自我介绍的时间把控 一般面试中的自我介绍控制在1 - 3分钟比较合适。时间…...
Pytorch构建LeNet进行MNIST识别 #自用
LeNet是一种经典的卷积神经网络(CNN)结构,由Yann LeCun等人在1998年提出,主要用于手写数字识别(如MNIST数据集)。作为最早的实用化卷积神经网络,LeNet为现代深度学习模型奠定了基础,…...
元宇宙崛起:区块链与金融科技共绘数字新世界
文章目录 一、引言二、元宇宙与区块链的深度融合三、区块链在元宇宙金融中的应用四、金融科技在元宇宙中的创新应用五、面临的挑战与机遇《区块链与金融科技》亮点内容简介获取方式 一、引言 随着科技的飞速发展,元宇宙概念逐渐走进人们的视野,成为数字…...
React Native 实现滑一点点内容区块指示器也滑一点点
效果图如上,内容滑一点点,指示器也按比例话一点点,列表宽度跟数据有关。 实现思路如下: 1.监听列表滑动事件,获取列表横向滑动距离,假设为A; 2.获取列表的宽度,及列表可滑动的宽度…...
怎么写C#命令行参数程序,及控制台带参数案例(程序完整源码)下载
C#命令行参数解析控制台带参数编写案例(程序完整源码)下载链接 https://download.csdn.net/download/luckyext/90434790 在CMD命令窗口,输入ping 、ipconfig等这样的命令,大家应该都知道,但很多同学可能不知道怎么写…...
全国青少年航天创新大赛各项目对比分析
全国青少年航天创新大赛各项目对比分析 一、比赛场地对比 项目名称场地尺寸场地特点组别差异筑梦天宫虚拟三维场景动态布局,小学组3停泊处,初高中组6停泊处;涉及传送带、机械臂、传感器等虚拟设备。初中/高中组任务复杂度更高,运…...
基于RAG的法律条文智能助手
文章目录 前言一、 项目背景与需求设计二、 数据收集与整理三、 核心实现流程1. 配置与模型初始化1. 配置区2. 模型初始化(init_models 函数)3. 数据加载与验证(load_and_validate_json_files 函数)4. 节点生成(create…...
智能对讲机:5G+AI赋能下的石油工业新“声”态
在浩瀚的能源版图上,中国正以非凡的“深度”探索着石油资源的奥秘。随着5G技术的不断成熟与普及,曾经“满山遍野找信号”的石油工人,如今已步入了一个全新的通信时代。在这个时代里,智能对讲机成为了连接指挥中心与一线工人的桥梁…...
leetcode日记(77)子集Ⅱ
不知道为什么看到这道题就很头痛…… 其实只要掌握nums不包含重复元素的情况下的代码就行了。 若nums不能包含重复元素,那么使用回溯很容易就能写出来: class Solution {void hs(vector<int> v,int x,vector<int> r,vector<vector<…...
Linux tar命令
压缩解压缩 1. tar 命令 语法: tar [主选项 辅选项] 文件或目录 参数功能-c创建新的归档文件(打包)-x从归档文件中提取文件(解包)-f <文件名>指定归档文件名-v显示操作的详细信息-z通过gzip压缩归档文件-j通…...
【nodeJS】服务端连接mysql、定义一个接口,并在前端调用
服务端连接数据库,并简单使用 服务器连接mysql后端定义接口前端调用接口封装axios(简易版)解决前端请求接口返回了一个html 定义api请求vue中调用接口 服务器连接mysql 安装mysql2:npm install mysql2启动服务:npm sta…...
驱动开发系列40 - Linux 显卡KMD驱动代码分析(一) - 设备初始化过程
目录 一:概述 二:显卡内核态驱动的主要功能 1. 设备初始化 2. 内存管理 3. 中断处理 4. 显示管理 5. 电源管理 三:Linux显卡内核态驱动的架构 四:PCI设备初始化过程 五:显卡设备初始化 一:概述 显卡内核态驱动(KMD)负责与GPU硬件直接交互,提供底层接口、管理显存…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...
