实现webget.cc

实现webget.cc实际上就是补充get_URL()函数。

这里比较值得注意的是通过套接字与采用http协议的服务器沟通的语法是这样的:

GET /hello HTTP/1.1        //注意这里换行符号为\r\n
Host: cs144.keithw.org
Connection:  close

在程序上表现为:

"GET " + path + " " + "HTTP/1.1\r\nHost: " + host + "\r\nConnection: close\r\n\r\n"

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

    TCPSocket sock1;
    Address addr = Address(host, "http");
    sock1.connect(addr);
    sock1.write("GET " + path + " " + "HTTP/1.1\r\nHost: " + host + "\r\nConnection: close\r\n\r\n");
    while (1) {
        auto recv = sock1.read(RECV_SIZE);
        cout << recv;
        if (sock1.eof())
            break;
    }
    sock1.close();
}

实现byte_stream.hh

实现byte_stream.hh即是实现byteStream这个类内部的一些函数,达到实现内存中可靠字节流的任务。

什么叫做内存中可靠字节流 \呢?

其实就是将数据流写入一个buffer中然后再读出来,由于是单线程操作,所以这个实现也比较简单。

使用数据结构std::deque即完成。

坑点1

实现文件EOF的时候,并不是文件读完就设置EOFtrue

那什么时候设置EOFTrue呢?

答案是: 当程序调用end_input()的时候,这个时候程序表示输入已经完成,在这个之后的读出buffer_size==0的时候才可以将EOF设置为true

坑点2

一开始我并没有使用std::deque,而是用一个char* Stream在构造函数中使用new得到空间,存储数据,但是给出的byteStream类中没有析构函数,所以为了不将byteStream类改变太大,我决定使用std:;deque



计算机网络   CS144      CS144 lab0

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!