1. asio::buffer常用的構造方法
asio::buffer有多種的構造方法,而且buffer大小是自動管理的
1.1 字元數組
char d1[128];size_t bytes_transferred = socket.receive(boost::asio::buffer(d1));
1.2 字元向量
std::vector<char> d2(128);size_t bytes_transferred = socket.receive(boost::asio::buffer(d2));
1.3 boost的數組
boost::array<char, 128> d3;size_t bytes_transferred = sock.receive(boost::asio::buffer(d3));
1.4 字串
string str = "hello world";bytes_transferred = socket.send(boost::asio::buffer(str));
2. asio::buffer的常用方法2.1 轉換方法
boost::asio::mutable_buffer b1 =boost::asio::buffer(str);unsigned char* p1 = boost::asio::buffer_cast<unsigned char*>(b1);
2.2 擷取大小
std::size_t s1 = boost::asio::buffer_size(b1);
3. asio::buffer的讀寫問題
注意的是boost::asio::const_buffer是唯讀buffer, 而boost::asio::mutable_buffer則可寫。
讀寫buffer也是有講究的
3.1 與transfer_all()結合
boost::array<char, 128> buf;boost::system::error_code ec;std::size_t n = boost::asio::read( socket, boost::asio::buffer(buf), boost::asio::transfer_all(), ec);if (ec){ // An error occurred.}else{ // n == 128}
boost::asio::transfer_all()能夠使buffer中的所有資料都傳送完畢。即讀滿buffer為止。
3.2 與transfer_at_least()結合
std::size_t n = boost::asio::read( socket, boost::asio::buffer(buf), boost::asio::transfer_at_least(64), ec);
意義即讀滿64位元組為止。返回。
當然還有最常用的bytes_transferred,這個例子就很多了。