boost--asio--读写大总结

来源:互联网 发布:买fm2药在淘宝搜什么 编辑:程序博客网 时间:2024/06/05 18:24

转自:http://blog.chinaunix.net/uid-22273897-id-393671.html

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 库全局函数读写有一个好处,就是能够利用

transfer_all

transfer_at_least

 俩个函数 ,

示例如下:

boost::array<char, 128> 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<char, 128> 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 <= 128

}

其实以上就是实现了socketRead_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

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 << "GET " << argv[2] << " HTTP/1.0\r\n";

    request_stream << "Host: " << argv[1] << "\r\n";

    request_stream << "Accept: */*\r\n";

    request_stream << "Connection: close\r\n\r\n";

    // 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 << "GET " << argv[2] << " HTTP/1.0\r\n";

    request_stream << "Host: " << argv[1] << "\r\n";

    request_stream << "Accept: */*\r\n";

    request_stream << "Connection: close\r\n\r\n";

    // Send the request.

boost::asio::write(socket, request);

boost::asio::streambuf b;

std::ostream os(&b);

os << "Hello, World!\n";

// 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;


0 0
原创粉丝点击