当前位置: 首页 > news >正文

「实验记录」CS144 Lab0 networking warmup

文章目录

  • 一、Motivation
  • 二、Solutions
    • S1 - Writing webget
    • S2 - An in-memory reliable byte stream
  • 三、Results
  • 四、Source

一、Motivation

第一个小测试 webget 是想让我们体验并模拟一下在浏览器中键入 URL 后获得远程服务器传来的内容,这并没有太大的难度,因为 Lab 本身已经为我们搭建好了 TCP/IP 五层协议栈的框架,我们要做的仅仅是解析传入的 host 和 path 即可,具体完善在 apps/webget.ccget_URL()

第二个基本组件也比较简单,是想让我们实现一个最基本且最常用的字节流,可以将其理解成是一个队列,可以从头部读出数据,也可以从末端写入数据。同样,大体的框架 Lab 已经实现好了,只需要我们在 libsponge/byte_stream.cc 中完善其各功能即可

二、Solutions

S1 - Writing webget

针对第一个测试点 webget,应该在 apps/webget.cc 中完善具体的 get_URL() 即可,

void get_URL(const string &host, const string &path) {TCPSocket sock;sock.connect(Address(host, "http"));sock.write("GET " + path + " HTTP/1.1\r\nHost: " + host + "\r\nConnection: close\r\n\r\n");sock.shutdown(SHUT_WR);while (!sock.eof())cout << sock.read();sock.close();
}

首先,进入函数内不管三七二十一,先建 socket,然后尝试与目标 web 主机建立 TCP 连接。成功后,透过 write 将获取 URL 内容的请求发送给服务器。发送完成之后,关闭 socket 写的 Channel,意味着不能再向该 socket 当中写数据了,或许只能读

之后,就是等待 web 主机回复。通过eof判断可读的 Channel 内是否有数据送来,送来一份,读一份,直到读完为止

S2 - An in-memory reliable byte stream

针对第二个测试点稍微复杂一点,要修改 libsponge/byte_stream.hlibsponge/byte_stream.cc 的内容,让其支持一个队列的功能,

在这里插入图片描述

对于 writer,主要就是能够写入数据并且自知状态,包括队列的剩余容量及 Channel 是否已被关闭。在这里,我选用 deque 双端对列作为 ByteStream 的底层数据结构,来研究一下 write()

size_t ByteStream::write(const string &data) 
{size_t len = data.length();/* 有多少容量写多少数据 */if(remaining_capacity() < data.length())len = remaining_capacity();for(size_t i=0; i<len; i++)buf_.push_back(data[i]);nwrite_ += len;return len;
}

首先,要透过 remaining_capacity() 看一下当前对列还能不能容下将要写入的数据,其定义如下,

size_t ByteStream::remaining_capacity() const 
{ return cap_ - buf_.size(); 
}

我们在此采用的是有多少容量,就写多少数据的策略,而不是 0 或 1 的策略(非写即丢)。定义了 nwrite_ 计数了一次 write 写了多少数据。end_input() 较为简单,只分辨是否还有字节将要写入,其定义如下,

void ByteStream::end_input() 
{ended_ = true; 
}

关于读操作,Lab0 的文档是这样规范的,
在这里插入图片描述

第一个 peek_output() 主要用来查看队首元素,定义如下,

string ByteStream::peek_output(const size_t len) const 
{if(len > buf_.size())return "";return string(buf_.begin(), buf_.begin()+len);
}

pop_output() 和查看队首的功能差不多,只是将查看功能改为删除,

void ByteStream::pop_output(const size_t len) 
{ if(len > buf_.size())return;for(size_t i=0; i<len; i++)buf_.pop_front();nread_ += len;
}

其中的 nread_nwrite_ 一样,用来统计 reader 已经读取了多少数据。read() 是框架定义好的,如下,

std::string read(const size_t len) {const auto ret = peek_output(len);pop_output(len);return ret;
}

之后的一系列状态返回函数,我不一一展开了,无非就是封装一下成员变量,对外提供状态查看功能罢了

三、Results

根据文档在 sponge 目录下新建 build 文件夹,然后在 build 里透过 cmake .. 初始化编译环境,接着透过 make -j4 进行编译
完成编译之后,可以透过 make check_webgetmake check_lab0 来检验自己程序的正确性

四、Source

  1. 【计算机网络】Stanford CS144 学习笔记
  2. [CS144] Lab 0: networking warmup
  3. 【斯坦福计网CS144项目】环境配置 & Lab0: ByteStream

相关文章:

「实验记录」CS144 Lab0 networking warmup

文章目录 一、Motivation二、SolutionsS1 - Writing webgetS2 - An in-memory reliable byte stream 三、Results四、Source 一、Motivation 第一个小测试 webget 是想让我们体验并模拟一下在浏览器中键入 URL 后获得远程服务器传来的内容&#xff0c;这并没有太大的难度&…...

html5怎么实现语音搜索

html5怎么实现语音搜索 谷歌的网站在他们首页发现了HTML5的新玩法——语音搜索。 注意&#xff1a; 只有webkit核心的浏览器才能使用 用法很简单 只需要在input添加属性x-webkit-speech即可&#xff0c;例子如下&#xff1a; 代码如下: <input type"text" x-…...

吴恩达《机器学习》1-2:什么是机器学习?

一、什么是机器学习&#xff1f; Arthur Samuel&#xff08;1959&#xff09;&#xff1a; 他定义机器学习为&#xff0c;在进行特定编程的情况下&#xff0c;给予计算机学习能力的领域。 Tom Mitchell&#xff08;1998&#xff09;&#xff1a; 他定义的机器学习是&#xff0c…...

基于STC系列单片机实现定时器扫描数码管显示定时器/计数器产生频率的功能

#define uchar unsigned char//自定义无符号字符型为uchar #define uint unsigned int//自定义无符号整数型为uint #define NixieTubeSegmentCode P0//自定义数码管段码为单片机P0组引脚 #define NixieTubeBitCode P2//自定义数码管位码为单片机P2组引脚 sbit LED P1^0;//位定义…...

Linux环境开发工具yum、makefile的使用 【Linux】

文章目录 Linux软件包管理器 - yumLinux下安装软件的方式yum查找软件包如何实现本地机器和云服务器之间的文件互传卸载软件Linux编译器 - gcc/g 程序的翻译过程1.预编译&#xff08;预处理&#xff09;2.编译&#xff08;生成汇编&#xff09;3.汇编&#xff08;生成机器可识别…...

第六章(6):Python中的函数—闭包和装饰器

1.闭包 在Python中,闭包是指函数与其相关的自由变量的一个整体。当一个函数返回了一个内部函数时,这个内部函数可以访问其定义所在的外部函数中的变量,即使这个外部函数已经返回了。这种特性就叫做闭包。 代码示意: def funca():x = 250def funcb():print(我仍然可以访问…...

Linux--安装与配置虚拟机及虚拟机服务器坏境配置与连接---超详细教学

一&#xff0c;操作系统介绍 1.1.什么是操作系统 操作系统&#xff08;Operating System&#xff0c;简称OS&#xff09;是一种系统软件&#xff0c;它是计算机硬件和应用软件之间的桥梁。它管理计算机的硬件和软件资源&#xff0c;为应用程序提供接口和服务&#xff0c;并协调…...

基于SSM的个性化美食推荐系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…...

Django 全局配置 settings 详解

文章目录 1 概述1.1 Django 目录结构 2 常用配置&#xff1a;settings.py2.1 注册 APP&#xff1a;INSTALLED_APPS2.2 模板路径&#xff1a;TEMPLATES2.3 静态文件&#xff1a;STATICFILES_DIRS2.4 数据库&#xff1a;DATABASES2.5 允许访问的主机&#xff1a;ALLOWED_HOSTS 1 …...

uniapp接口请求api封装,规范化调用

封装规范和vue中的差不多&#xff0c;都是统一封装成一个request对象&#xff0c;然后在api.js里面调用。 先创建一个utils文件夹&#xff0c;然后里面创建一个request.js&#xff0c;代码如下&#xff1a; export const baseURL 基础url地址const request (options) > …...

色彩校正及OpenCV mcc模块介绍

一、术语 1.光&#xff1a;是电磁波&#xff0c;可见光是可被人眼感知的电磁波。可见光大约在400-700nm波段。光子携带的能量与波长成反比&#xff0c;400nm--700nm之间的单色光的颜色从紫色渐变成红色。 2.光谱&#xff1a;除了太阳光源外&#xff0c;LED灯、白炽灯等各种照明…...

2023mathorcup大数据数学建模竞赛A题坑洼道路识别67页完整高质量原创论文

大家好&#xff0c;从昨天肝到现在&#xff0c;终于完成了本次mathorcup大数据数学建模竞赛A题基于计算机视觉的坑洼道路检测和识别的完整论文了。 给大家看一下目录吧&#xff1a; 摘 要&#xff1a; 10 一、问题重述 12 二&#xff0e;问题分析 13 2.1问题一 13 2.2问题…...

【k8s】5、资源管理命令-声明式

目录 一、 yaml和json介绍 1、yuml语言介绍 2、k8s支持的文件格式 3、yaml和json的主要区别 二、声明式对象管理 1、命令式对象配置 2、声明式对象配置 3、声明式对象管理命令介绍 三、编写资源配置清单 1、 编写yaml文件 2、 启动并查看资源 3、创建service服务对外…...

信息系统项目管理师教程 第四版【第6章-项目管理概论-思维导图】

信息系统项目管理师教程 第四版【第6章-项目管理概论-思维导图】 课本里章节里所有蓝色字体的思维导图...

【Flutter】Flutter 中的图片管理 图片优化的最佳实践

【Flutter】Flutter 中的图片管理 图片优化的最佳实践 文章目录 一、前言二、图片资源的重要性1. 对于项目复杂性的影响2. 性能和资源优化3. 国际化和多平台支持4. UI/UX 的角度看图片管理5. 图片资源与应用安全三、Flutter 中的图片资源分类1. Asset 图片2. 网络图片3. 本地文…...

dash--项目的前端展示简单基础

1.前置工作 创建虚拟环境&#xff1a; sudo apt-get install python3-venv # 安装 python3 -m venv venv # 在本目录下创建venv虚拟环境&#xff08;也是一个文件夹。如果用不到这个虚拟环境以后就rm -rf venv&#xff09; source venv/bin/activate # 激活虚拟环境临时使用清华…...

LeetCode 面试题 16.06. 最小差

文章目录 一、题目二、C# 题解 一、题目 给定两个整数数组 a 和 b&#xff0c;计算具有最小差绝对值的一对数值&#xff08;每个数组中取一个值&#xff09;&#xff0c;并返回该对数值的差 示例&#xff1a; 输入&#xff1a;{1, 3, 15, 11, 2}, {23, 127, 235, 19, 8} 输出&…...

css-表格样式

滑动表格 外层嵌套一个盒子设置固定大小&#xff0c;并添加overflow:hidden auto只有y轴滑动&#xff0c;隐藏x轴滑动 表头固定不滑动可以添加position:sticky;top:0 <div style"width:878px;height:685px;overflow:hidden auto" class"tableDiv">…...

Linux对网络通信的实现

一、NIO为什么很少注册OP_WRITE事件 1、OP_WRITE触发条件&#xff1a;当操作系统写缓冲区有空闲时就绪。一般情况下写缓冲区都有空闲空间&#xff0c;小块数据直接写入即可&#xff0c;没必要注册该操作类型&#xff0c;否则该条件不断就绪浪费cpu&#xff1b;但如果是写密集型…...

【开源】基于SpringBoot的车险自助理赔系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 车辆档案模块2.4 车辆理赔模块2.5 理赔照片模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 角色表3.2.2 车辆表3.2.3 理赔表3.2.4 理赔照片表 四、系统展示五、核心代码5.1 查询车…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...