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

【斯坦福CS144】Lab0

一、实验目的

1.初步了解计算机网络,准备实验所需的材料和环境;

2.掌握基础实验方法;

3.动手实现网络功能。

二、实验内容

1.下载实验所需的资料,安装虚拟机,配置环境;

2.获取一个网页;

3.监听和链接:尝试让自己的电脑变成一个简单的服务器,等待其他客户端连接;

4.使用套接字编写网络程序。

三、实验过程

(一)获取实验材料

电脑上已经安装过VMware虚拟机软件,无需再次下载;

在Ubuntu官网下载最新镜像。

(二)安装虚拟机

打开VMware,新建虚拟机

选择ubuntu64位

设置安装位置

为避免后期空间不足,适当加大磁盘大小

设置处理器

选择ISO镜像文件

安装

进行简单设置

稍作等待后安装成功

设置ubuntu管理员密码

安装vim

修改阿里云镜像

修改失败 使用图形化界面寻找最佳服务器

点击选择最佳服务器,进行测试

测试结束,选择该服务器

选择重新载入

安装cmake

安装g++

打开浏览器,访问http://cs144.keithw.org/hello

在终端中依次输入四条命令

telnet cs144.keithw.org http

GET /hello HTTP/1.1

Host: cs144.keithw.org

Connection: close

输入http://cs144.keithw.org/lab0/20212734

再次手动获取

监听和连接

按下crtl+c断开连接

安装git软件包

获取实验材料

进入目录

新建“build”目录

编译代码

在 build 目录中,使用编辑器打开 …/apps/webget.cc,将get_URL函数进行替换

测试程序

编写 …/src/byte_steam.cc 和 …/src/byte_steam.hh。在 .cc 文件中编写你的代码,在 .hh 文件中定义你的私有成员变量。(此处以.hh为例)

测试代码

实验结束。

四、实验体会

1.在本实验中,我通过获取一个网页,尝试让自己的电脑变成一个简单的服务器,等待其他客户端连接,我使用套接字编写了网络程序这些实验初步了解了计算机网络的实验实现,对计算机网络有了更加深入的了解;

2.在本实验中,我遇到的问题主要是在获取网页连续键入四条命令时总是超时,因为此处的服务器会因请求超时而关闭连接,只能通过粘贴方式输入。但我的虚拟机反复粘贴失败,最后查证是因为VMware Tools出现问题,重新安装后即可解决。

五、代码附录

byte_stream.cc

#include <stdexcept>#include "byte_stream.hh"using namespace std;ByteStream::ByteStream( uint64_t capacity ) : capacity_( capacity ) {}void Writer::push( string data ) noexcept
{auto len = min( data.size(), available_capacity() );  // 确定可写入的数据长度if ( len == 0 ) { // 如果可写入的数据长度为0,说明已经写满了,返回return;} else if ( len < data.size() ) { // 如果可写入的数据长度小于 data 的长度,说明只能写入部分数据data.resize( len );             // 将 data 的长度截断为可写入的长度}// 将 data 写入到 buffer 中buffer_data.push( move( data ) );if ( buffer_data.size() == 1)  // 写入前为空时需要更新 buffer_viewbuffer_view = buffer_data.front();// 更新已写入的数据长度bytes_pushed_ += len;
}void Writer::close() noexcept
{flag |= ( 1 << CLOSED );
}void Writer::set_error() noexcept
{flag |= ( 1 << ERROR );
}bool Writer::is_closed() const noexcept
{return flag & ( 1 << CLOSED );
}uint64_t Writer::available_capacity() const noexcept
{return capacity_ - reader().bytes_buffered();
}uint64_t Writer::bytes_pushed() const noexcept
{return bytes_pushed_;
}string_view Reader::peek() const noexcept
{return buffer_view;
}bool Reader::is_finished() const noexcept
{return writer().is_closed() && ( bytes_buffered() == 0 );
}bool Reader::has_error() const noexcept
{return flag & ( 1 << ERROR );
}void Reader::pop( uint64_t len ) noexcept
{if ( len > bytes_buffered() ) {return;}// 更新已弹出的数据长度bytes_popped_ += len;// 将 buffer 中的数据弹出while ( len > 0 ) {if ( len >= buffer_view.size() ) {len -= buffer_view.size();buffer_data.pop();buffer_view = buffer_data.front(); // 最开始就保证了 buffer_data 不为空} else {buffer_view.remove_prefix( len );len = 0;}}
}uint64_t Reader::bytes_buffered() const noexcept
{return writer().bytes_pushed() - bytes_popped();
}uint64_t Reader::bytes_popped() const noexcept
{return bytes_popped_;
}

Byte_stream.hh

// byte_stream.hh
#pragma once
#include <cstdint>
#include <queue>
#include <stdexcept>
#include <string>
#include <string_view>using std::uint64_t;class Reader;
class Writer;class ByteStream
{
protected:enum State { CLOSED, ERROR };uint64_t capacity_;uint64_t bytes_pushed_ {}; // 已写入的字节数uint64_t bytes_popped_ {}; // 已弹出的字节数unsigned char flag {};        // 0: normal, 1: closed, 2: errorstd::queue<std::string> buffer_data {};std::string_view buffer_view {};public:explicit ByteStream( uint64_t capacity );// 提供ByteStream的 reader 和 writer 接口的辅助函数Reader& reader();const Reader& reader() const;Writer& writer();const Writer& writer() const;
};class Writer : public ByteStream
{
public:void push( std::string data ) noexcept; // 在可用容量允许的范围内向流中写入数据void close() noexcept; // 关闭流,不允许再向流中写入数据void set_error() noexcept; // 流中出现错误,置位错误标志bool is_closed() const noexcept;      // 判断流是否已关闭uint64_t available_capacity() const noexcept; // 计算流中剩余可用容量uint64_t bytes_pushed() const noexcept;       // 计算流中已写入的字节数
};class Reader : public ByteStream
{
public:std::string_view peek() const noexcept; // 返回流中下一个数据块的只读视图void pop( uint64_t len ) noexcept;      // 从流中弹出指定长度的数据块bool is_finished() const noexcept; // 判断流是否已关闭且所有数据块都已弹出bool has_error() const noexcept;   // 判断流是否出现错误uint64_t bytes_buffered() const noexcept; // 计算当前流中剩余的字节数uint64_t bytes_popped() const noexcept;   // 计算流中已弹出的字节数
};/** read: A (provided) helper function thats peeks and pops up to `len` bytes* from a ByteStream Reader into a string;*/
void read( Reader& reader, uint64_t len, std::string& out );

相关文章:

【斯坦福CS144】Lab0

一、实验目的 1.初步了解计算机网络&#xff0c;准备实验所需的材料和环境&#xff1b; 2.掌握基础实验方法&#xff1b; 3.动手实现网络功能。 二、实验内容 1.下载实验所需的资料&#xff0c;安装虚拟机&#xff0c;配置环境&#xff1b; 2.获取一个网页&#xff1b; …...

关于Mybatis中,IPage<PO>转换成IPage<VO>的问题

以下是一个比较常见通用的一个查询并且为单表查询&#xff0c;在开发初期&#xff0c;或者项目不是很复杂的时候&#xff0c;或者一开始项目框架就规划好的情况下&#xff0c;通常我们都会封装。 在我们的项目中&#xff0c;这部分代码其实是自动生成的&#xff0c;足以满足大…...

使用idea和vecode创建vue项目并启动(超详细)

一、idea创建vue项目 创建项目之前先下载好插件 新建项目找到vue生成器 写好名称&#xff0c;找到自己需要存放的地址&#xff0c;node解释器安装方式可以看我上一个博客&#xff0c;vueCLI是选择vue的版本&#xff0c;我们可以使用idea自带的vue版本默认是vue3&#xff0c;创…...

C#|.net core 基础 - 删除字符串最后一个字符的七大类N种实现方式

今天想通过和大家分享如何删除字符串最后一个字符的N种实现方法&#xff0c;来回顾一些基础知识点。 01第一类、字符串方式 这类方法是通过string类型自身方法直接实现。 1、Substring方法 相信大多数人第一个想到的可能就是这个方法。Substring方法是字符串内置方法&#…...

成都睿明智科技有限公司怎么样靠谱吗?

随着短视频与直播的深度融合&#xff0c;抖音电商凭借其强大的流量入口、精准的算法推荐以及便捷的购物体验&#xff0c;迅速崛起。对于传统企业和新兴品牌而言&#xff0c;这无疑是一个不可多得的机遇。然而&#xff0c;如何在这片红海中脱颖而出&#xff0c;就需要借助专业的…...

docker简述

1.安装dockers&#xff0c;配置docker软件仓库 安装&#xff0c;可能需要开代理&#xff0c;这里我提前使用了下好的包安装 启动docker systemctl enable --now docker查看是否安装成功 2.简单命令 拉取镜像&#xff0c;也可以提前下载使用以下命令上传 docker load -i imag…...

第27周:Transformer实战:文本分类

目录 前言 一、前期准备 1.1 环境安装 1.2 加载数据 二、数据预处理 2.1 构建词典 2.2 生成数据批次和迭代器 2.3 构建数据集 三、模型构建 3.1 定义位置编码器 3.2 定义Transformer模型 3.3 初始化模型 3.4 定义训练函数 3.5 定义评估函数 四、训练模型 4.1 模…...

在QT中将Widget提升为自定义的Widget后,无法设置Widget的背景颜色问题解决方法

一、问题 在Qt中将QWidget组件提升为自定义的QWidget后&#xff0c;Widget设置的样式失效&#xff0c;例如设置背景颜色为白色失效。 二、解决方法 将已经提升的QWidget实例对象&#xff0c;脱离父窗体的样式&#xff0c;然后再重新设置自己的样式。...

【学习笔记】手写一个简单的 Spring IOC

目录 一、什么是 Spring IOC&#xff1f; 二、IOC 的作用 1. IOC 怎么知道要创建哪些对象呢&#xff1f; 2. 创建出来的对象放在哪儿&#xff1f; 3. 创建出来的对象如果有属性&#xff0c;如何给属性赋值&#xff1f; 三、实现步骤 1. 创建自定义注解 2. 创建 IOC 容器…...

日记学习小迪安全27

感觉复制粘贴没有意思&#xff0c;而且还有点浪费时间&#xff0c;主要是学习&#xff0c;不是复制&#xff0c;那就复制别人的吧 第27关就参考这篇文章吧&#xff0c;以下大部分内容都是参考以下文章&#xff08;侵权删除&#xff09; 第27天&#xff1a;WEB攻防-通用漏洞&a…...

【React】类组件和函数组件

构建组件的方式 函数式组件&#xff08;function&#xff09;createElement&#xff08;不建议使用&#xff09;类组件形式创建&#xff08;不建议使用&#xff09; 对于 React 的理解 React, 用于构建用户界面的JavaScript库&#xff0c;本身只提供了Ul层面的解决方案。&am…...

Spring Boot应用开发

Spring Boot是一个基于Spring框架的开源Java框架&#xff0c;旨在简化新Spring应用的初始化和开发过程。它通过提供各种默认配置&#xff0c;减少了繁琐的配置&#xff0c;使开发者能够专注于业务逻辑的实现。本文将介绍Spring Boot的基本概念、优点、关键特性以及如何构建一个…...

mysql事务使用和事务隔离级别与sqlserver的比较

在 MySQL 中&#xff0c;事务 (Transaction) 是一个将一组 SQL 语句作为一个整体执行的机制。事务确保要么所有操作都执行成功&#xff0c;要么在遇到错误时回滚到之前的状态&#xff0c;从而保证数据库数据的一致性和完整性。 事务的四大特性&#xff08;ACID&#xff09; 事…...

双光吊舱图像采集详解!

一、图像采集 可见光图像采集&#xff1a; 使用高性能的可见光相机&#xff0c;通过镜头捕捉自然光或人工光源照射下的目标图像。 相机内部通常配备有先进的图像传感器&#xff0c;如CMOS或CCD&#xff0c;用于将光信号转换为电信号。 红外图像采集&#xff1a; 利用红外热…...

1688商品详情关键词数据-API

要利用 Python 爬虫采集 1688 商品详情数据&#xff0c;需要先了解 1688 网站的页面结构和数据请求方式。一般使用 requests 库请求网站的数据&#xff0c;使用 BeautifulSoup 库解析网页中的数据。 以下是一个简单的 Python 爬虫采集 1688 商品详情数据的示例代码&#xff1a…...

vue 的属性绑定

双大括号不能在 HTML attributes 中使用。想要响应式地绑定一个 attribute&#xff0c;应该使用 v-bind 指令。 <template> <div v-bind:class"boxClass" v-bind:id"boxId"> </div> </template><script> export default{da…...

【附源码】Python :打家劫舍

系列文章目录 Python 算法学习&#xff1a;打家劫舍问题 文章目录 系列文章目录一、算法需求二、解题思路三、具体方法源码方法1&#xff1a;动态规划&#xff08;自底向上&#xff09;方法2&#xff1a;动态规划&#xff08;自顶向下&#xff09;方法3&#xff1a;优化的动态…...

YOLO11改进 | 注意力机制| 对小目标友好的BiFormer【CVPR2023】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 本文介绍了一种新颖的动态稀疏注意力机制…...

高级Python开发工程师的面试备考指南

目录 博客标题:高级Python开发工程师的面试备考指南:30个面试问题与详细解析岗位职责问题解析1. 公司产品功能开发和代码维护2. 技术方案与项目计划制定3. 算法基础与代码优化4. 项目管理与团队协作任职要求问题解析5. Python 开发经验6. 数据处理相关库(Pandas, Numpy, Mat…...

【Java】JAVA知识总结浅析

Java是一门功能强大的编程语言&#xff0c;广泛应用于多个领域。Java的编程思想&#xff0c;包括面向过程和面向对象编程&#xff0c;Java的发展历史&#xff0c;各版本的特点&#xff0c;JVM原理&#xff0c;数据类型&#xff0c;Java SE与Java EE的区别&#xff0c;应用场景&…...

拯救你的Flash回忆:CefFlashBrowser让经典内容重获新生

拯救你的Flash回忆&#xff1a;CefFlashBrowser让经典内容重获新生 【免费下载链接】CefFlashBrowser Flash浏览器 / Flash Browser 项目地址: https://gitcode.com/gh_mirrors/ce/CefFlashBrowser 你是否曾经因为现代浏览器不再支持Flash而无法重温那些经典的教学课件&…...

AI 使用过程中遇到的问题及解决方案

////////////////////////////////////////////////////////////////////////////////////////////////////////context_management: Extra inputs are not permitted Received Model Groupclaude-sonnet-4-6错误原因这是 Claude API 的 context management&#xff08;上下文管…...

3天掌握MediaPipe:从零开始构建实时AI应用的终极指南

3天掌握MediaPipe&#xff1a;从零开始构建实时AI应用的终极指南 【免费下载链接】mediapipe Cross-platform, customizable ML solutions for live and streaming media. 项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe 想快速上手实时AI应用开发却不知…...

汽车智能制造如何落地?从“黑灯工厂”看AI赋能的关键路径

一、当工厂学会在黑暗中自行运转偌大的汽车生产车间里&#xff0c;灯光熄灭&#xff0c;只有AGV小车穿梭的微光和机械臂有节奏的运作声。没有工人的手电筒&#xff0c;也没有巡检的脚步&#xff0c;一切生产、检测、调度都在黑灯状态下有条不紊地进行。这并非科幻电影&#xff…...

Java应用Istio mTLS启用后gRPC调用持续超时?紧急解锁x509证书链校验、SNI配置与Java SSLContext动态刷新机制

第一章&#xff1a;Java应用Istio mTLS启用后gRPC调用持续超时&#xff1f;紧急解锁x509证书链校验、SNI配置与Java SSLContext动态刷新机制当Istio启用严格mTLS&#xff08;STRICT模式&#xff09;后&#xff0c;Java客户端通过gRPC调用服务端频繁出现DEADLINE_EXCEEDED超时&a…...

科哥二次开发Image-to-Video:性能提升39%,小白友好度大增

科哥二次开发Image-to-Video&#xff1a;性能提升39%&#xff0c;小白友好度大增 1. 项目背景与核心价值 Image-to-Video技术正在改变内容创作的方式&#xff0c;它能够将静态图片转化为生动的视频内容。然而&#xff0c;原始I2VGen-XL模型在实际应用中面临两大挑战&#xff…...

手把手教你用Simulink和Carsim 2019搭建车辆动力学模型(附二自由度模型源码)

从零构建车辆动力学联合仿真模型&#xff1a;Simulink与Carsim 2019实战指南 当你第一次打开Carsim和Simulink时&#xff0c;面对两个庞大软件的无缝对接需求&#xff0c;很容易陷入"从哪开始"的困惑。本文将带你一步步搭建完整的车辆动力学仿真环境&#xff0c;从软…...

STM32CubeMX实战指南:从零搭建HAL库项目与LED控制

1. STM32CubeMX与HAL库开发入门 第一次接触STM32开发的朋友可能会被各种专业术语吓到——寄存器、固件库、HAL库、时钟树配置... 作为一个从51单片机转战STM32的"过来人"&#xff0c;我完全理解这种困惑。三年前我刚开始用STM32F103时&#xff0c;光是搭建开发环境就…...

麦克风效率革命:MicMute让静音操作提速90%的终极体验升级

麦克风效率革命&#xff1a;MicMute让静音操作提速90%的终极体验升级 【免费下载链接】MicMute Mute default mic clicking tray icon or shortcut 项目地址: https://gitcode.com/gh_mirrors/mi/MicMute 你是否经历过线上会议中手忙脚乱寻找静音按钮的窘迫&#xff1f;…...

3种颠覆式方案:让IDM突破限制的秘密

3种颠覆式方案&#xff1a;让IDM突破限制的秘密 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 作为技术侦探&#xff0c;我们经常遇到用户反馈IDM试用到期的困扰…...