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…...
Spring WebFlux 中 WebSocket 使用 DataBuffer 的注意事项
以下是修改后的完整文档,包含在多个多线程环境中使用 retain() 和 release() 方法的示例,且确保在 finally 块中调用 release(): 在 Spring WebFlux 中,WebSocketMessage 主要用于表示 WebSocket 的消息载体,其中 getP…...
Android ChatOn-v1.66.536-598-[构建于ChatGPT和GPT-4o之上]
ChatOn 链接:https://pan.xunlei.com/s/VOKYnq-i3C83CK-HJ1gfLf4gA1?pwdwzwc# 添加了最大无限积分 删除了所有调试信息 语言:全语言支持...
游戏树搜索与优化策略:Alpha-Beta剪枝及其实例分析
1.Alpha-Beta搜索 Alpha-Beta 搜索是一种用于对抗性游戏(比如象棋、围棋)的智能算法,目的是帮助计算机快速找到“最优走法”,同时避免不必要的计算。它的核心思想是:通过剪掉明显糟糕的分支,大幅减少需要计…...
基于Qwen-VL的手机智能体开发
先上Demo: vl_agent_demo 代码如下: 0 设置工作目录: 你的工作目录需要如下: 其中utils文件夹和qwenvl_agent.py均参考自 GitHub - QwenLM/Qwen2.5-VL: Qwen2.5-VL is the multimodal large language model series developed by …...
记录一次Spring事务失效导致的生产问题
一、背景介绍 公司做的是“聚合支付”业务,对接了微信、和包、数字人民币等等多家支付机构,我们提供统一的支付、退款、自动扣款签约、解约等能力给全国的省公司、机构、商户等。 同时,需要做对账功能,即支付机构将对账文件给到…...
深度学习实战:用TensorFlow构建高效CNN的完整指南
一、为什么每个开发者都要掌握CNN? 在自动驾驶汽车识别路标的0.1秒里,在医疗AI诊断肺部CT片的精准分析中,甚至在手机相册自动分类宠物的日常场景里,卷积神经网络(CNN)正悄然改变着我们的世界。本文将以工业…...
算法 之 贪心思维训练!
文章目录 从最大/最小开始贪心2279.装满石头的背包的最大数量2971.找到最大周长的多边形 从最左、最右开始贪心2712.使所有字符相等的最小成本 划分型贪心1221.分割平衡字符串 贪心策略在处理一些题目的时候能够带来意想不到的效果 从最小/最大开始贪心,优先考虑最小…...
从0到1构建AI深度学习视频分析系统--基于YOLO 目标检测的动作序列检查系统:(1)视频信息的获取与转发
文章大纲 基于YOLO的动作序列检查系统架构设计系统架构图实时视频传输协议技术对比视频流 常见协议对比表三、WebSocket内网传输设计方案四、样例程序(Python + JavaScript)五、性能优化建议新兴技术预警参考文献提示词参考基于YOLO的动作序列检查系统架构设计 系统架构图 #…...
大语言模型学习--LangChain
LangChain基本概念 ReAct学习资料 https://zhuanlan.zhihu.com/p/660951271 LangChain官网地址 Introduction | 🦜️🔗 LangChain LangChain是一个基于语言模型开发应用程序的框架。它可以实现以下应用程序: 数据感知:将语言模型…...
【PCIe 总线及设备入门学习专栏 4.5 -- PCIe 中断 MSI 与 MSI-X 机制介绍】
文章目录 PCI 设备中断机制PCIe 设备中断机制PCIe MSI 中断机制MSI CapabilityMSI-X 中断机制MSI-X capabilityMSI-X TablePBAMSI-X capability 解析MSI/MSI-X 操作流程扫描设备配置设备MSI 配置MSI-X 配置中断触发与处理PCI 设备中断机制 以前的PCI 设备是支持 物理上的 INTA…...
wxWidgets GUI 跨平台 入门学习笔记
准备 参考 https://wiki.wxwidgets.org/Microsoft_Visual_C_NuGethttps://wiki.wxwidgets.org/Tools#Rapid_Application_Development_.2F_GUI_Buildershttps://docs.wxwidgets.org/3.2/https://docs.wxwidgets.org/latest/overview_helloworld.htmlhttps://wizardforcel.gitb…...
valgrind 检测多线程 bug,检测 并发 bug concurrent bug parallel bug
valgrind --toolhelgrind ./your_program 如果检测的对象是大型程序,可以设定仅在某些函数中开启 valgrind 的检测: Valgrind 提供了一些客户请求(client requests),可以在代码中插入特定的宏来控制 Valgrind 的行为。…...
OpenMCU(一):STM32F407 FreeRTOS移植
概述 本文主要描述了STM32F407移植FreeRTOS的简要步骤。移植描述过程中,忽略了Keil软件的部分使用技巧。默认读者熟练使用Keil软件。本文的描述是基于OpenMCU_FreeRTOS这个工程,该工程已经下载放好了移植stm32f407 FreeRTOS的所有文件 OpenMCU_FreeRTOS工…...
割平面法的理解
割平面法的理解 1. 简介 割平面法(Cutting Plane Method)用于求解整数规划问题,通过逐步添加线性约束(割平面)逼近整数解。本文以Gomory割平面法为例,结合简单示例拆解核心步骤。 2. 示例详解 问题描述 …...
[自动驾驶-传感器融合] 多激光雷达的外参标定
文章目录 引言外参标定原理ICP匹配示例参考文献 引言 多激光雷达系统通常用于自动驾驶或机器人,每个雷达的位置和姿态不同,需要将它们的数据统一到同一个坐标系下。多激光雷达外参标定的核心目标是通过计算不同雷达坐标系之间的刚性变换关系(…...
C++ 学习(八)(模板,可变参数模板,模板专业化(完整模板专业化,部分模板专业化),类型 Traits,SFINAE(替换失败不是错误),)
C 模板 C 中的模板是一项强大的功能,允许您编写通用代码,这意味着您可以编写可以处理不同数据类型的单个函数或类。这意味着您无需为要使用的每种数据类型编写单独的函数或类。 模板函数 要创建模板函数,请使用 关键字,后跟类型…...
AI---DevOps常备工具(AI-Integrated DevOps Essential Tools)
AI---DevOps常备工具 技术领域正在迅速发展,随着我们步入 2025 年,有一点是明确的:人工智能(AI)不再只是一个流行词,它是每个 DevOps 工程师都需要掌握的工具。随着云环境的复杂性增加、对更快部署的需求以…...
题目梳理2025[长期更新]
题目梳理 组合类题目(2025年3月5日) 组合总数1,组合总数2,组合总数3 -> 递归回溯的思想 组合总数4 -> 爬楼的思想,动态规划,确定递归边界,确定递归入口,最后一步怎么走的思想...
Maven 中 SNAPSHOT 版本与 RELEASE 版本的区别
Maven 仓库分为 Snapshot 快照仓库和 Release 发行仓库两种类型的仓库。Snapshot 快照仓库用于保存 SNAPSHOT 版本,Release 发行仓库用于保存 RELEASE 版本。 SNAPSHOT 是一种特殊的版本标识,主要用于表示项目的不稳定、正在开发中的版本,而…...
JavaScript 知识点整理
1. 什么是AST?它在前端有哪些应用场景? AST Abstract Syntax Tree抽象语法树,用于表达源码的树形结构 应用: Babel:一个广泛使用的 JS 编译器,将ES6 或 JSX 等现代语法转换为兼容性较好的 ES5 代码。Esl…...
迷你世界脚本出生点接口:Spawnport
出生点接口:Spawnport 彼得兔 更新时间: 2023-04-26 10:19:56 具体函数名及描述如下: 序号 函数名 函数描述 1 getSpawnPoint(...) 获取默认出生点 2 setSpawnPoint(...) 设置出生点位置 3 getChunkValidSpawnPos(...) 获取区块有效刷新点…...
鸿蒙与DeepSeek深度整合:构建下一代智能操作系统生态
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/north 目录 技术融合背景与价值鸿蒙分布式架构解析DeepSeek技术体系剖析核心整合架构设计智能调度系统实现…...
利用行波展开法测量横观各向同性生物组织的生物力学特性|文献速递-医学影像人工智能进展
Title 题目 Measurement of biomechanical properties of transversely isotropic biological tissue using traveling wave expansion 利用行波展开法测量横观各向同性生物组织的生物力学特性 01 文献速递介绍 纤维嵌入结构在自然界中普遍存在。从脑白质(罗曼…...
AR配置静态IP双链路负载分担示例
AR配置静态IP双链路负载分担示例 适用于大部分企业网络出口 业务需求: 运营商1分配的接口IP为100.100.1.2,子网掩码为255.255.255.252,网关IP为100.100.1.1。 运营商2分配的接口IP为200.200.1.2,子网掩码为255.255.255.248&am…...
文件操作(详细讲解)(1/2)
你好这里是我说风俗,希望各位客官点点赞,收收藏,关关注,各位对我的支持是我持续更新的动力!!!!第二期会马上更的关注我获得最新消息哦!!!…...
[AI]从零开始的so-vits-svc歌声推理及混音教程
一、前言 在之前的教程中已经为大家讲解了如何安装so-vits-svc以及使用现有的模型进行文本转语音。可能有的小伙伴就要问了,那么我们应该怎么使用so-vits-svc来进行角色歌曲的创作呢?其实歌曲的创作会相对麻烦一些,会使用到好几个软件&#x…...
华为OD机试-停车场最大距离(Java 2024 E卷 100分)
题目描述 停车场有一排车位,用 0 表示空位,1 表示已停车。至少有一辆车停在车位上,也至少有一个空位。为了防剐蹭,需要找到一个空位,使得该空位与最近的车辆之间的距离最大。返回这个最大距离。 输入描述 一个用半角逗号分隔的停车标识字符串,停车标识为 0 或 1,0 表示…...
SpringMVC控制器定义:@Controller注解详解
文章目录 引言一、Controller注解基础二、RequestMapping与请求映射三、参数绑定与数据校验四、RestController与RESTful API五、控制器建议与全局处理六、控制器测试策略总结 引言 在SpringMVC框架中,控制器(Controller)是整个Web应用的核心组件,负责处…...
免费分享一个软件SKUA-GOCAD-2022版本
若有需要,可以下载。 下载地址 通过网盘分享的文件:Paradigm SKUA-GOCAD 22 build 2022.06.20 (x64).rar 链接: https://pan.baidu.com/s/10plenNcMDftzq3V-ClWpBg 提取码: tm3b 安装教程 Paradigm SKUA-GOCAD 2022版本v2022.06.20安装和破解教程-CS…...
