cs144建議我們使用Modern C++來(lái)完成所有的lab,關(guān)于modern c++的全面的用法可以在(http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines)獲取。
創(chuàng)新互聯(lián)專注于企業(yè)全網(wǎng)營(yíng)銷推廣、網(wǎng)站重做改版、東臺(tái)網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、html5、商城建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為東臺(tái)等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。以下是一些代碼規(guī)范:
malloc()
和free()
new
和delete
(FILE)*x
,必要時(shí)使用C++的static_cast
char *s
,和C語(yǔ)言中的字符串函數(shù)strlen(), strcpy()
,應(yīng)使用c++中std::string
const Address & address
)make format
來(lái)修改代碼風(fēng)格在本次熱身實(shí)驗(yàn)中,我們將會(huì)利用操作系統(tǒng)預(yù)先存在的接口來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的TCP socket,并利用這個(gè)tcp socket來(lái)實(shí)現(xiàn)對(duì)網(wǎng)頁(yè)的請(qǐng)求。
使用OS的流套接字寫(xiě)一個(gè)網(wǎng)絡(luò)程序這個(gè)部分比較簡(jiǎn)單,只需要按照handout所說(shuō),看完TCPSocket,F(xiàn)ileDescriptor,Socket和Address這幾個(gè)類的介紹,就能很快的完成這個(gè)程序,其實(shí)只需要看TCPSocket
class就行。這些源代碼都在libsponge\util
中。
在linux系統(tǒng)中,一切皆文件。
webget.c
void get_URL(const string &host, const string &path) {TCPSocket tsk;
tsk.connect(Address(host,"http"));
tsk.write("GET " + path + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
string str;
while(!tsk.eof()) {tsk.read(str);
cout<< str;
}
tsk.close();
}
注意的是write的字符串要寫(xiě)成HTTP請(qǐng)求的格式,這也就是我們的應(yīng)用層數(shù)據(jù),在通過(guò)socket后會(huì)封裝上TCP頭部再丟進(jìn)網(wǎng)絡(luò)層傳輸。
內(nèi)存中的可靠數(shù)據(jù)流我們要完成的任務(wù)是實(shí)現(xiàn)一個(gè)類似于管道的數(shù)據(jù)結(jié)構(gòu)ByteStream,這個(gè)channel有兩端,一端是input side,負(fù)責(zé)向channel中輸入字符串,另一端是output side,負(fù)責(zé)從channel中讀取字符串并且取出來(lái),在抽象的數(shù)據(jù)結(jié)構(gòu)中來(lái)看,std::deque
雙端隊(duì)列最合適不過(guò)。
這個(gè)管道是有容量限制的,其在初始化時(shí)就會(huì)規(guī)定好其capacity,作為在任意時(shí)刻channel內(nèi)的大字符量。隨著output side對(duì)channel內(nèi)字符串的讀取,input side被允許寫(xiě)入更多的字符串,這意味著B(niǎo)yteStream可以傳輸比其自身capacity更大的數(shù)據(jù),換句話就是ByteStream的容量理論上可以達(dá)到無(wú)限,只要input side持續(xù)地write。
在對(duì)ByteStream的功能熟悉后,我們就可以在libsponge\byte_stream.hh
和libsonge\byte_stream.cc
的骨架代碼中完成我們的實(shí)現(xiàn)。這里需要特別強(qiáng)調(diào)一下**EOF
的狀態(tài):**end of file
是指在input side終止了輸入的前提下,output side從channel中讀取完了所有的字符串,此時(shí)ByteStream中的數(shù)據(jù)為空,并且不會(huì)再有數(shù)據(jù)輸入。
對(duì)于ByteStream類,我添加的私有成員如下:
class ByteStream {private:
// Your code here -- add private members as necessary.
size_t _capacity;
bool _eof = false;
std::deque_buffer;
size_t _total_write;
size_t _total_read;
bool _error{}; //!< Flag indicating that the stream suffered an error.
...
}
ByteStream類的方法的實(shí)現(xiàn):
ByteStream::ByteStream(const size_t capa) : _capacity(capa), _eof(false), _buffer(), _total_write(0), _total_read(0) {}
size_t ByteStream::write(const string &data) {size_t remain_size = _capacity - _buffer.size();
size_t len = min(remain_size, data.length());
for (size_t i = 0; i< len; i++)
_buffer.push_back(data[i]);
_total_write += len;
return len;
}
//! \param[in] len bytes will be copied from the output side of the buffer
string ByteStream::peek_output(const size_t len) const {size_t l = min(len, _buffer.size());
string output = "";
for (size_t i = 0; i< l; i++)
output += _buffer[i];
return output;
}
//! \param[in] len bytes will be removed from the output side of the buffer
void ByteStream::pop_output(const size_t len) {size_t l = min(len, _buffer.size());
_total_read += l;
while (l--)
_buffer.pop_front();
}
//! Read (i.e., copy and then pop) the next "len" bytes of the stream
//! \param[in] len bytes will be popped and returned
//! \returns a string
std::string ByteStream::read(const size_t len) {string str = peek_output(len);
pop_output(len);
return str;
}
void ByteStream::end_input() {_eof = true; }
bool ByteStream::input_ended() const {return _eof; }
size_t ByteStream::buffer_size() const {return _buffer.size(); }
bool ByteStream::buffer_empty() const {return _buffer.empty(); }
bool ByteStream::eof() const {return _eof && _buffer.empty(); }
size_t ByteStream::bytes_written() const {return _total_write; }
size_t ByteStream::bytes_read() const {return _total_read; }
size_t ByteStream::remaining_capacity() const {return _capacity - _buffer.size(); }
通過(guò)下列指令完成編譯;
mkdir build
cd build
cmake ..
make
make check_lab0
結(jié)果如下:
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧