CS144 - LAB0

CS144 - Lab 0


telnet 发送请求

如图,很简单,但是注意输入时间太久会超时

在这里插入图片描述

发邮箱

首先我们需要用命令行去发邮箱,这里我用企业微信邮箱给自己的 qq 邮箱发送~

整个命令如下!

在这里插入图片描述

对于其中的参数,其实从英文就可以看出来,首先连接到企业微信邮箱的发送邮箱的服务器,然后输入 HELO smtp.exmail.qq.com 表示开始进行和 smtp 服务器的会话,然后我们可以输入 AUTH LOGIN 来鉴权,首先输入你的邮箱的对应的 base64 的编码,比如我的邮箱是 rinai@g-rinai.cn 就将他转换为 base64 编码就可以了,然后我们还需要一个登录密码,注意,这个密码虽然也需要 base64 编码,但是并不是需要你的登录密码,而是一个密钥,基本每个邮箱客户端都会有这样一个位置给我们提供这样一个密钥,比如我是企业微信邮箱,获取密钥的位置在这里:

在这里插入图片描述

点击生成新密码,然后把对应的密码输入到 base64 编码器即可,注意,如果你的码暴露给别人了,请及时删除,比如我现在用完就删了😇

然后鉴权成功,我们可以输入发送方,接收方,输入内容,然后输入 “换行” + “.” 就可以结束了。

在这里插入图片描述

结果是成功发送,通过这个方法,你可以给别人发邮件😍😍😍,那么,Next。


netcat 启动服务器

我们可以使用 netcat -v -l -p 9090 在本地启动一个服务器,端口为 9090,我们在另一个窗口可以通过 telnet localhost 9090 来连接本地的这个服务器。

编写 webget

这里就是真正涉及到代码了,我们需要用套接字实现我们刚刚第一个 telnet 发送请求的功能,这里感觉并不是很难,就是我对套接字编程不太熟悉,很多系统调用都不知道😭,然后我去看了一下 linux 高性能服务器编程里面的套接字编程,就看了几个 API 就写出来了,哈哈。

我们首先通过 gethostbyname 来获取域名对应的 ip 信息,然后创建一个套接字,并与对应的 ip 建立连接,发送我们的请求的内容,这里很简单,就是我们刚刚 telnet 之后写的内容,只需要注意一下换行符就可以了,然后从套接字里面循环读取数据到缓冲区并打印就可以了!

void get_URL(const string& host, const string& path)
{cerr << "Function called: get_URL(" << host << ", " << path << ")\n";// 通过域名解析获取 ipstruct hostent *server = gethostbyname(host.c_str());if (server == NULL) {cerr << "Error: Could not get host information for " << host << "\n";return;}// 这是一个用来表示 ipv4 地址信息的结构体// 用于套接字编程struct sockaddr_in server_addr;// 填充这个结构体server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = *(u_long*)server->h_addr_list[0];server_addr.sin_port = htons(80);// 本地创建一个套接字int sockfd = socket(AF_INET, SOCK_STREAM, 0);if ( sockfd < 0 ) {cerr << "Error: Could not create socket\n";return;}// 连接到远程服务器if (connect(sockfd, (struct sockaddr*) &server_addr, sizeof(server_addr)) < 0 ) {cerr << "Error: Could not connect to server\n";return;}string request = "GET " + path + " HTTP/1.1\r\nHost: " + host + "\r\nConnection: close\r\n\r\n";if (send(sockfd, request.c_str(), request.size(), 0) < 0) {cerr << "Error: Could not send request\n";return;}char buffer[1024];int bytes_read = 0;while ((bytes_read = recv(sockfd, buffer, sizeof(buffer), 0)) > 0 ) {write(1, buffer, bytes_read);}if (bytes_read < 0) {cerr << "Error: Could not read response\n";return;}close(sockfd);
}

结果如下:

root@r-linux:/home/rinai/project/CS144# cmake --build build --target check_webget 
Test project /home/rinai/project/CS144/buildStart 1: compile with bug-checkers
1/2 Test #1: compile with bug-checkers ........   Passed    0.20 secStart 2: t_webget
2/2 Test #2: t_webget .........................   Passed    1.10 sec100% tests passed, 0 tests failed out of 2Total Test time (real) =   1.30 sec
Built target check_webget

内存可靠字节流

这里很简单,就是写一个读写缓冲区模型,其实跟咱消费者生产者模型还是挺像的哈,主要就是一个缓冲区的状态管理,这里我不太熟悉 cpp 的生态,这里直接用了 string 类型来表示字节流了。

我的实现:

首先我们需要查看注释,为所谓的 bytestream 类添加成员字段:

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_ {};// added state:std::string buffer_; uint64_t read_cnt_;uint64_t write_cnt_;bool closed_ {};
};

然后我们需要为 Writer 和 Reader 实现构造函数和对应的读写方法。

#include "byte_stream.hh"using namespace std;ByteStream::ByteStream( uint64_t capacity ): capacity_(capacity),buffer_(),  read_cnt_(0),write_cnt_(0)
{
}
void Writer::push( string data )
{if (Writer::is_closed()) return;Writer::write_cnt_ += min(Writer::available_capacity(), data.size());Writer::buffer_.append( data );Writer::buffer_.resize( min(Writer::buffer_.size(), capacity_) );return;
}void Writer::close()
{Writer::closed_ = true;
}bool Writer::is_closed() const
{return Writer::closed_;
}uint64_t Writer::available_capacity() const
{return capacity_ - Writer::buffer_.size();
}uint64_t Writer::bytes_pushed() const
{return Writer::write_cnt_;
}string_view Reader::peek() const
{std::string_view view(Writer::ByteStream::buffer_.data(), Writer::ByteStream::buffer_.size());return view;
}void Reader::pop( uint64_t len )
{if (Reader::is_finished())return;if (len > Reader::bytes_buffered())return;printf("before buffer size: %lu\n", Reader::buffer_.size());Reader::buffer_.erase(0, len);printf("after buffer size: %lu\n", Reader::buffer_.size());Reader::read_cnt_ += len;return;
}bool Reader::is_finished() const
{return Reader::closed_ && Reader::buffer_.empty();
}uint64_t Reader::bytes_buffered() const
{return Reader::buffer_.size();
}uint64_t Reader::bytes_popped() const
{return Reader::read_cnt_;
}

写的时候也需要熟悉一下 cpp 的语法了,感觉这种面向对象的结构还挺新鲜的,跟 go 的结构完全不一样。

最后:

root@r-linux:/home/rinai/project/CS144# cmake --build build --target check0
Test project /home/rinai/project/CS144/buildStart  1: compile with bug-checkers1/11 Test  #1: compile with bug-checkers ........   Passed    0.85 secStart  2: t_webget2/11 Test  #2: t_webget .........................   Passed    1.27 secStart  3: byte_stream_basics3/11 Test  #3: byte_stream_basics ...............   Passed    0.02 secStart  4: byte_stream_capacity4/11 Test  #4: byte_stream_capacity .............   Passed    0.01 secStart  5: byte_stream_one_write5/11 Test  #5: byte_stream_one_write ............   Passed    0.01 secStart  6: byte_stream_two_writes6/11 Test  #6: byte_stream_two_writes ...........   Passed    0.02 secStart  7: byte_stream_many_writes7/11 Test  #7: byte_stream_many_writes ..........   Passed    0.10 secStart  8: byte_stream_stress_test8/11 Test  #8: byte_stream_stress_test ..........   Passed    0.03 secStart 37: no_skip9/11 Test #37: no_skip ..........................   Passed    0.01 secStart 38: compile with optimization
10/11 Test #38: compile with optimization ........   Passed    3.15 secStart 39: byte_stream_speed_testByteStream throughput (pop length 4096): 11.88 Gbit/sByteStream throughput (pop length 128):   2.13 Gbit/sByteStream throughput (pop length 32):    0.56 Gbit/s
11/11 Test #39: byte_stream_speed_test ...........   Passed    0.36 sec100% tests passed, 0 tests failed out of 11Total Test time (real) =   5.84 sec
Built target check0

clear

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/81585.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kafka SASL/PLAIN 认证及 ACL 权限控制

一、Zookeeper 配置 SASL/PLAIN 认证&#xff08;每个zookeeper节点都要做&#xff09; 1.1 在 zookeeper 的 conf 目录下&#xff0c;创建 zk_server_jaas.conf 文件&#xff0c;内容如下 Server {org.apache.kafka.common.security.plain.PlainLoginModule requiredusernam…

20250528-C#知识:函数简介及函数重载

C#知识&#xff1a;函数简介及函数重载 本文主要介绍函数参数和函数重载相关的知识点 1、函数 函数一般写在类中 一般函数调用 static int Add(int num, int value){num value;return num;}//一般函数调用&#xff0c;发生值类型参数的复制int num 1;Add(num, 1); //调用…

Vue内置指令与自定义指令

一、前言 在 Vue 开发中&#xff0c;指令&#xff08;Directives&#xff09; 是一种非常强大的特性&#xff0c;它允许我们以声明式的方式操作 DOM。Vue 提供了一些常用的内置指令&#xff0c;如 v-if、v-show、v-bind、v-on 等&#xff0c;同时也支持开发者根据需求创建自己…

华为AP6050DN无线接入点瘦模式转胖模式

引言 华为AP6050DN是一款企业级商用的无线接入点。由于产品定位原因,其默认工作在瘦模式下,即须经AC统一控制和管理,是不能直接充当普通的无线路由器来使用的。 而本文的目的,就是让其能脱离AC的统一控制和管理,当作普通无线路由器来使用。 硬件准备 华为AP6050DN无线接…

程序员出海之英语-使用手册

为什么现在实时翻译工具这么牛逼了&#xff0c;AI转译这么准确了&#xff0c;我还在这里跟老古董一样吭哧吭哧学英语呢&#xff1f; 这是因为我们始终是和人打交道&#xff0c;不仅仅是为了考试&#xff0c;看懂官方文章&#xff0c;听懂官方视频。这里为什么说官方&#xff0c…

Java 事务管理:在分布式系统中实现可靠的数据一致性

Java 事务管理&#xff1a;在分布式系统中实现可靠的数据一致性 在当今的软件开发领域&#xff0c;分布式系统逐渐成为主流架构。然而&#xff0c;这也给事务管理带来了巨大的挑战。本文将深入探讨 Java 事务管理在分布式系统中的关键要点&#xff0c;并通过详细代码实例展示如…

微信小程序关于截图、录屏拦截

1.安卓 安卓&#xff1a; 在需要禁止的页面添加 onShow() {if (wx.setVisualEffectOnCapture) {wx.setVisualEffectOnCapture({visualEffect: hidden,complete: function(res) {}})}},// 页面隐藏和销毁时需要释放防截屏录屏设置onHide() {if (wx.setVisualEffectOnCapture) {w…

使用 PySpark 从 Kafka 读取数据流并处理为表

使用 PySpark 从 Kafka 读取数据流并处理为表 下面是一个完整的指南&#xff0c;展示如何通过 PySpark 从 Kafka 消费数据流&#xff0c;并将其处理为可以执行 SQL 查询的表。 1. 环境准备 确保已安装: Apache Spark (包含Spark SQL和Spark Streaming)KafkaPySpark对应的Ka…

第十天的尝试

目录 一、每日一言 二、练习题 三、效果展示 四、下次题目 五、总结 一、每日一言 哈哈&#xff0c;十天缺了两天&#xff0c;我写的文章现在质量不高&#xff0c;所以我可能考虑&#xff0c;应该一星期或者三四天出点高质量的文章&#xff0c;同时很开心大家能够学到知识&a…

mediapipe标注视频姿态关键点(基础版加进阶版)

前言 手语视频流的识别有两种大的分类&#xff0c;一种是直接将视频输入进网络&#xff0c;一种是识别了关键点之后再进入网络。所以这篇文章我就要来讲讲如何用mediapipe对手语视频进行关键点标注。 代码 需要直接使用代码的&#xff0c;我就放这里了。环境自己配置一下吧&…

Redis数据迁移方案及持久化机制详解

#作者&#xff1a;任少近 文章目录 前言Redis的持久化机制RDBAOF Redis save和bgsave的区别redis数据迁移redis单机-单机数据迁移redis 主从-主从数据迁移redis 单机-cluster数据迁移redis cluster –redis cluster数据迁移 前言 Redis数据迁移是常见需求&#xff0c;主要包括…

图论回溯

图论 200.岛屿数量DFS 给你一个由 ‘1’&#xff08;陆地&#xff09;和 ‘0’&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外&#xff…

真实网络项目中交换机常用的配置与解析

一、配置三层链路聚合增加链路带宽 1.组网需求 某企业有多个部门分布在不同的地区&#xff0c;由于业务发展的需要&#xff0c;不同区域的部门与部门之间有进行带有VLAN Tag的报文的传输需求。采用透明网桥的远程桥接和QinQ功能&#xff0c;可以实现企业在不同区域部门之间进…

【Redis】过期键删除策略,LRU和LFU在redis中的实现,缓存与数据库双写一致性问题,go案例

一、Redis 中的过期键删除策略有哪些&#xff1f; 采用了 惰性删除 和 定期删除 两种策略处理过期键&#xff1a; 1. 惰性删除&#xff08;Lazy Deletion&#xff09; 机制&#xff1a;只有在访问 key 时才检查是否过期&#xff0c;如果已过期则立刻删除。优点&#xff1a;对…

为什么单张表索引数量建议控制在 6 个以内

单张表索引数量建议控制在6个以内的主要原因包括以下几点‌&#xff1a; ‌性能影响‌&#xff1a;索引会占用额外的磁盘空间。如果索引数量过多&#xff0c;会占用大量的磁盘空间&#xff0c;尤其是在数据量较大的情况下&#xff0c;索引占用的空间可能会超过数据本身。此外&…

深度学习实战109-智能医疗随访与健康管理系统:基于Qwen3(32B)、LangChain框架、MCP协议和RAG技术研发

大家好,我是微学AI,今天给大家介绍一下深度学习实战109-智能医疗随访与健康管理系统:基于Qwen3(32B)、LangChain框架、MCP协议和RAG技术研发。在当今医疗信息化快速发展的背景下,医疗随访与健康管理面临着数据分散、信息整合困难、个性化方案生成效率低等挑战。传统的医疗随…

聊一聊 .NET Dump 中的 Linux信号机制

一&#xff1a;背景 1. 讲故事 当 .NET程序 在Linux上崩溃时&#xff0c;我们可以配置一些参考拿到对应程序的core文件&#xff0c;拿到core文件后用windbg打开&#xff0c;往往会看到这样的一句信息 Signal SIGABRT code SI_USER (Sent by kill, sigsend, raise)&#xff0c…

如何在uniapp H5中实现路由守卫

目录 Vue3 app.config.globalProperties 1. 创建 Vue 应用实例 2. 添加全局属性或方法 3. 在组件中使用全局属性或方法 beforeEach在uniapp的注册 1、在H5中这两个对象是都存在的。「router:route」但是功能并不全面,具体可参考下图。 2、刚刚测试了一下,在微信小程序…

无人机降落伞设计要点难点及原理!

一、设计要点 1. 伞体结构与折叠方式 伞体需采用轻量化且高强度的材料&#xff08;如抗撕裂尼龙或芳纶纤维&#xff09;&#xff0c;并通过多重折叠设计&#xff08;如三重折叠缝合&#xff09;减少展开时的阻力&#xff0c;同时增强局部承力区域的强度。 伞衣的几何参数&am…

AI时代新词-AI增强现实(AI - Enhanced Reality)

一、什么是AI增强现实&#xff08;AI - Enhanced Reality&#xff09;&#xff1f; AI增强现实&#xff08;AI - Enhanced Reality&#xff09;是指将人工智能&#xff08;AI&#xff09;技术与增强现实&#xff08;Augmented Reality&#xff0c;简称AR&#xff09;技术相结合…