CS144 Lab0

CS144 Lab0

0 热身

手动给网站发请求

在终端依次输入以下命令:

telnet cs144.keithw.org http
GET /hello HTTP/1.1   //这是在告诉服务url部分
Host: cs144.keithw.org //这是在告诉服务host path
Connection: close //告诉服务你已经完成请求了,服务不久将会返回一个响应
//attention! 这里要输入两个回车,上面每步结束输入一个回车
//attention! 手速要快,太慢会timeout

得到响应:Helo CS144!

image

手动给自己发邮件

用163发的邮件,先去设置->打开IMAP/SMTP服务,得到授权码并保存。用以下命令得到邮箱账号、授权码的base64编码:

echo -n 待加密的内容 | base64

在终端中依次输入:

telnet smtp.163.com 25 
HELO //必须先发这句
AUTH LOGIN
//提示:334 xxxx
依次输入邮箱、授权码的base64编码
//提示: Authentication successful
MAIL FROM: <YouEmail@163.com> //:后的空格和< >都不能省略
//提示:250 Mail OK
RCPT TO: <receiverEmail@163.com>
//提示:250 Mail OK
DATA
//提示:354 End data with <CR><LF>.<CR><LF>
开始写正文
. //用单独一行的.表示输入结束
//提示:250 Mail OK
QUIT //与服务器断开连接

监听端口

在终端中输入

netcat -v -l -p 9090
//提示:telnet localhost 9090

打开另一个终端,输入

telnet localhost 9090

接下来可以从任意终端发消息,另一方都能收到。

1 环境搭建

教程里给了好几种模式,但最新的文档是Fall 2025的,Ubuntu都一路用到24了,我的20.04怕是不够用,为了不在过程中因为未知的意外报错,有条件的建议使用镜像(image)。听说旧版的lab4更难,且对虚拟机要求没那么高,就网上找了别人几年前拉好的仓库:https://gitee.com/kangyupl/sponge Lab0的代码在master分支里,题解在solution里,我们把master下载下来就行。

sponge版本的需要gcc-8,用以下命令更新:

sudo apt-get install gcc-8 g++-8
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 100
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-11 100
gcc -v
//提示是>=8的就行

编译项目

cd sponge
mkdir build
cd build
cmake ..
make

这样就算完成:

image

2 Solve

阅读文档hint和要求阅读的socket.hh、address.hh文件后,就能明白建立连接需要什么:address、TCPSocket两个类,而发起请求和收到响应的本质是文件的read/write.

void get_URL(const string &host, const string &path) {

    Address address = Address(host,"80");
    
    TCPSocket tcpSock = TCPSocket( );
    
    tcpSock.connect(address);

    std::string request="GET "+path+" "+"HTTP/1.1\r\n"+
    "Host: "+host+"\r\n"+
    "Connection: close\r\n\r\n";
  
    tcpSock.write(request);
    
    tcpSock.shutdown(SHUT_WR);
    
    while ( !tcpSock.eof() )
    {
        std::string str;
        tcpSock.read(str);
        cerr << str << '\n';
    }
    
    tcpSock.close();
    
    cerr << "Function called: get_URL(" << host << ", " << path << ").\n";

}

遇到Bug:

read: Connection reset by peer

并且刚才在终端里telnet时有响应,现在也变成了Connection closed by foreign host.

在排查了环境问题(终端 curl https://youtuber.com/ 能通)和代码问题(和参考写得基本一样,运行别人代码也不行)后,这个问题不是自己造成的,一时间无法解决。

posted @   liyishui  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示