zoukankan      html  css  js  c++  java
  • BOOST中read_some和 boost::asio::error::eof(2)错误

    当socket读写完成调用回调函数时候一定要检查 是不是有EOF错误,如果有那么好了,另一方已经断开连接了别无选择,你也断开把。
     
    for (;;) {
        boost::array < char, 128 > buf;
        boost::system::error_code error;
        size_t len = socket.read_some(boost::asio::buffer(buf), boost::asio::assign_error(error));
        //当服务器关闭连接时,boost::asio::ip::tcp::socket::read_some()会用boost::asio::error::eof标志完成, 这时我们应该退出读取循环了. 
        if (error == boost::asio::error::eof)
          break;
        // Connection closed cleanly by peer.
        else if (error)
          throw error;
        // Some other error.
        std::cout.write(buf.data(), len);
    }
    //如果发生了什么异常我们同样会抛出它 
    

    关于read_some的理解,有数据可读则会读取最大不超过buffer指定的大小的数据。例如read_some( 1024 个字节), socket的接收中只有128个字节,那就读取尽可能能多的(128字节)数据并返回; 当socket的接收缓冲中有4096个字节,超过指定的1024个字节,则会读取1024个字节并返回。

    在异步async_read_some中是一样,回调会立即返回并只调用一次,

     原文 http://blog.chinaunix.net/uid-22273897-id-393662.html
  • 相关阅读:
    521.最长特殊序列 I
    520.检查大写字母
    459.重复的子字符串
    Java 读取 .properties 文件的几种方式
    Idea 使用教程
    db2 with用法
    DB2 alter 新增/删除/修改列
    Bootstrap treegrid 实现树形表格结构
    Mysql 递归查询
    navicat for mysql 下载安装教程
  • 原文地址:https://www.cnblogs.com/lovelylife/p/5536229.html
Copyright © 2011-2022 走看看