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
繁體地址,請注明出處:http://hk.pswp.cn/web/81585.shtml
英文地址,請注明出處:http://en.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;技術相結合…