NO.1 ASIO 读操作大总结: A. Boos::asio::read 同步读方式 void client::read_data(char * sourse , int num ) { boost::asio::read( socket_own , boost::asio::buffer( sourse , num ) ); } Buffer 可以换成 boost::streambuf 如: boost::asio::streambuf response ; boost::asio::read (socket, response ); 而 streambuf 是能过自动扩充的 。 B. boost::asio::read_until 同步方式读, 但是读到特定的字符串后结束 例子; boost::asio::streambuf response; boost::asio::read_until(socket, response, "\r\n"); C: boost::asio::read_at 是在读的时候加上一个偏移量( I thin k )但是我用在socket的读写上没有成功, 可能用在其他device 上, 好吧,先不用你 。 直接用boost::asio 库全局函数读写有一个好处,就是能够利用 [boost_asio/reference/transfer_all.html] [boost_asio/reference/transfer_at_least.html] 俩个函数 , 示例如下: boost::array buf; boost::system::error_code ec; std::size_t n = boost::asio::read( sock, boost::asio::buffer(buf), boost::asio::transfer_all(), ec); if (ec) { // An error occurred. } else { // n == 128 } 同理:boost::array buf; boost::system::error_code ec; std::size_t n = boost::asio::read( sock, boost::asio::buffer(buf), boost::asio::transfer_at_least(64), ec); if (ec) { // An error occurred. } else { // n >= 64 && n } 其实以上就是实现了socket。Read_some 的作用 。 --------------------------------------------------------------------------------- D.重量出击 socke 成员函数 读操作 Socket. Receive ( boost::asio::buffer( buff ) ); 利用receive的好处之一就是它既可以代替read 函数,同时还可以在后边加一个flag 参数 , 设置socket 的属性。 E: 更好使的是 socket.read_some ( boost::asio::buffer( buff ) ) ; 这个函数的神奇之处在于, 你在buffer中设置了比较大的缓冲区,这没有问题 , 它并不一定会把缓冲区填满才完成,而是读到eof 即完成操作,这样我们可以不必在关心server到底会发多少size_t 给client,我们 只管设置一个较大缓冲区, read_some 就知道读多少。它返回 std::size_t. F: 以上介绍的都是同步方式操作的,下面是相对应的异步读操作。 如下是 boost::asio 命名空间下: [async_read ] [async_read_at ] [async_read_until.html ] boost::asio::async_read( socket_own , boost::asio::buffer ( data_copy ) , boost::bind( & client::handle_read ,this , boost::asio::placeholders::error , boost::asio::placeholders::bytes_transferred ); ); 相对应的socket 的成员函数 异步操作如下: [async_read_some ] [async_receive ] 示例如下: void handler( const boost::system::error_code& error, // Result of operation. std::size_t bytes_transferred // Number of bytes read. ); socket.async_read_some(boost::asio::buffer(data, size), handler); 很好的是, async_read_some 能够知道读多少数据, 所以我们的size可以尽可能的大一点,而 receive 的话可以保证读固定大小数据。 --------------------------------------------------------------------------------------- 第二部分 写 ASIO 写操作大总结: A. Boos::asio::write 同步写方式 void client::write_data(char * sourse , int num ) { boost::asio::write( socket_own , boost::asio::buffer( sourse , num ) ); } Buffer 可以换成 boost::streambuf 如: boost::asio::streambuf request; std::ostream request_stream(&request); request_stream request_stream request_stream request_stream // Send the request. boost::asio::write(socket, request); 而read_until 同写 操作 , 例子 参照上 。 [async_write ] 同上, Socket 相应的成员函数 void handler( const boost::system::error_code& error, // Result of operation. std::size_t bytes_transferred // Number of bytes written. ); socket.async_write_some(boost::asio::buffer(data, size), handler); Socket.send 能够实现相同的功能并且能够添加flag 参数。 第三部分 Boost::streambuf 的 操作总结 boost::asio::streambuf request; std::ostream request_stream(&request); request_stream request_stream request_stream request_stream // Send the request. boost::asio::write(socket, request); boost::asio::streambuf b; std::ostream os(&b); os // try sending some data in input sequence size_t n = sock.send(b.data()); b.consume(n); // sent data is removed from input sequence Reading from a socket directly into a streambuf: boost::asio::streambuf b; // reserve 512 bytes in output sequence boost::asio::streambuf::const_buffers_type bufs = b.prepare(512); size_t n = sock.receive(bufs); // received data is "committed" from output sequence to input sequence b.commit(n); std::istream is(&b); std::string s; is >> s; |