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硬件直接交互,提供底层接口、管理显存…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...

SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...

《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...