日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Boost】boost库asio详解6——boost::asio::error的用法浅析

發布時間:2024/4/11 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Boost】boost库asio详解6——boost::asio::error的用法浅析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 概述

一般而言我們創建用于接收error的類型大多聲明如下:
[cpp]?view plain?copy ?print?
  • boost::system::error_code?error??
  • 我們用這個類型去接受在函數中產生的錯誤, 如:?
    [cpp]?view plain?copy ?print?
  • socket.connect(endpoint,?error);??
  • 如果連接失敗,錯誤類型會保存到error中,比如連接主機失敗可能會返回這樣的錯誤
    [cpp]?view plain?copy ?print?
  • boost::asio::error::host_not_found;??
  • 通過if(error)檢測到error后,拋出異常
    [cpp]?view plain?copy ?print?
  • throw?boost::system::system_error(error);??
  • 需要注意的是,我們的error被轉化成 system_error了
    顯示錯誤很簡單了,std::cout << e.what()

    2. 異步調用

    產生的異常error的傳遞是個問題,因為異步會立刻返回,局部變量是會被銷毀的。而boost::asio::placeholders::error, 將會保存異常的狀態,這樣我們使用異步調用時如
    socket::async_write_some的時候不用自己創建boost::system::error_code error了,直接使用boost::asio::placeholders::error作為參數即可,
    同理,我們sync_write_some需要返回讀寫數據的大小,令人開心的是boost::asio::placeholders::bytes_transferred直接作為參數就可以保存數據大小。
    實例如下:
    [cpp]?view plain?copy ?print?
  • boost::asio::async_write(socket_,??
  • ?????????????????????????boost::asio::buffer(message_),??
  • ?????????????????????????boost::bind(&tcp_connection::handle_write,?shared_from_this(),??
  • ?????????????????????????boost::asio::placeholders::error,??
  • ?????????????????????????boost::asio::placeholders::bytes_transferred));??
  • 參考手冊上說的很明確,下面兩個類就是為異步調用使用bind的時候設計的。
    [cpp]?view plain?copy ?print?
  • boost::asio::placeholders::error??
  • boost::asio::placeholders::bytes_transferred??
  • 3. 同步調用

    當然了boost::system::error_code error還用有用的,同步調用的時候我們就用它作為參數。如:
    [cpp]?view plain?copy ?print?
  • boost::system::error_code?error;??
  • size_t?len?=?socket.read_some(boost::asio::buffer(buf),?error);??
  • 同樣在異步調用的回調handle中也用它作參數如
    [cpp]?view plain?copy ?print?
  • void?handle_write(const?boost::system::error_code&?/*error*/,??
  • ??????????????????size_t?/*bytes_transferred*/)??
  • {??
  • }??
  • 4. 總結

    異步就用 boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred
    同步就用 boost::system::error_code

    總結

    以上是生活随笔為你收集整理的【Boost】boost库asio详解6——boost::asio::error的用法浅析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。