• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-379  評論-37  文章-0  trackbacks-0
            ASIO的同步方式
             Boost.Asio是一個跨平臺的網絡及底層IO的C++編程庫,它使用現代C++手法實現了統一的異步調用模型。
            頭文件 #include
            名空間 using namespace boost::asio;
            ASIO庫能夠使用TCP、UDP、ICMP、串口來發送/接收數據,
            下面先介紹TCP協議的讀寫操作對于讀寫方式,ASIO支持同步和異步兩種方式,
            首先登場的是同步方式,
            下面請同步方式自我介紹一下:大家好!我是同步方式!我的主要特點就是執著!
            所有的操作都要完成或出錯才會返回,不過偶的執著被大家稱之為阻塞,實在是郁悶~~(場下一片噓聲),
            其實這樣 也是有好處的,比如邏輯清晰,編程比較容易。
            在服務器端,我會做個socket交給acceptor對象,讓它一直等客戶端連進來,連上以后再通過這個socket與客戶端通信,
            而所有的通信都是以阻塞方式進行的,讀完或寫完才會返回。在客戶端也一樣,
            這時我會拿著socket去連接服務器,當然也是連上或出錯了才返回,最后也是以阻塞的方式和服務器通信。
            有人認為同步方式沒有異步方式高效,其實這是片面的理解。
            在單線程的情況下可能確實如此,我不能利用耗時的網絡操作這段時間做別的事 情,不是好的統籌方法。
            不過這個問題可以通過多線程來避免,比如在服務器端讓其中一個線程負責等待客戶端連接,連接進來后把socket交給另外的線程去 和客戶端通信,這樣與一個客戶端通信的同時也能接受其它客戶端的連接,主線程也完全被解放了出來。
            我的介紹就有這里,謝謝大家!好,感謝同步方式的自我介紹,
            現在放出同步方式的演示代碼(起立鼓掌!):
            服務器端
            1.#include
            2.#include
            3.
            4.using namespace boost::asio;
             5.
             6.int main(int argc, char* argv[])
            7.{
            8. // 所有asio類都需要io_service對象
            9. io_service iosev;
            10. ip::tcp::acceptor acceptor(iosev,
            11. ip::tcp::endpoint(ip::tcp::v4(), 1000));
            12. for(;;)
            13. {
            14. // socket對象
            15. ip::tcp::socket socket(iosev);
             16. // 等待直到客戶端連接進來
            17. acceptor.accept(socket);
            18. // 顯示連接進來的客戶端
            19. std::cout << socket.remote_endpoint().address() << std::endl;
            20. // 向客戶端發送hello world!
            21. boost::system::error_code ec;
            22. socket.write_some(buffer("hello world!"), ec);
            23.
            24. // 如果出錯,打印出錯信息
            25. if(ec)
            26. {
            27. std::cout <<
            28. boost::system::system_error(ec).what() << std::endl;
            29. break;
            30. }
            31. // 與當前客戶交互完成后循環繼續等待下一客戶連接
            32. }
            33. return 0;
            34.}

            客戶端
            1.#include
            2.#include
            3.
            4.using namespace boost::asio;
            5.
            6.int main(int argc, char* argv[])
            7.{
            8. // 所有asio類都需要io_service對象
            9. io_service iosev;
            10. // socket對象
            11. ip::tcp::socket socket(iosev);
            12. // 連接端點,這里使用了本機連接,可以修改IP地址測試遠程連接
            13. ip::tcp::endpoint ep(ip::address_v4::from_string("127.0.0.1"), 1000);
            14. // 連接服務器
            15. boost::system::error_code ec;
            16. socket.connect(ep,ec);
            17. // 如果出錯,打印出錯信息
            18. if(ec)
            19. {
            20. std::cout << boost::system::system_error(ec).what() << std::endl;
            21. return -1; 22. }
            23. // 接收數據
            24. char buf[100];
            25. size_t len=socket.read_some(buffer(buf), ec);
            26. std::cout.write(buf, len);
            27.
            28. return 0;
            29.}

            從演示代碼可以得知
            •ASIO的TCP協議通過boost::asio::ip名 空間下的tcp類進行通信。
            •IP地址(address,address_v4,address_v6)、 端口號和協議版本組成一個端點(tcp:: endpoint)。
            用于在服務器端生成tcp::acceptor對 象,并在指定端口上等待連接;或者在客戶端連接到指定地址的服務器上。
            •socket是 服務器與客戶端通信的橋梁,連接成功后所有的讀寫都是通過socket對 象實現的,當socket析 構后,連接自動斷 開。
            •ASIO讀寫所用的緩沖區用buffer函 數生成,這個函數生成的是一個ASIO內部使用的緩沖區類,它能把數組、指針(同時指定大 小)、std::vector、std::string、boost::array包裝成緩沖區類。
             •ASIO中的函數、類方法都接受一個boost::system::error_code類 型的數據,用于提供出錯碼。
            它可以轉換成bool測試是否出錯,并通過boost::system::system_error類 獲得詳細的出錯信息。
            另外,也可以不向ASIO的函數或方法提供 boost::system::error_code,這時如果出錯的話就會直 接拋出異常,異常類型就是boost::system:: system_error(它是從std::runtime_error繼承的)。
            posted on 2009-08-19 00:29 小王 閱讀(651) 評論(0)  編輯 收藏 引用 所屬分類: 網絡通訊
            伊人久久大香线蕉综合Av| 久久这里只精品国产99热 | 亚洲AV无码久久| 国产毛片欧美毛片久久久| 99久久无码一区人妻a黑| 国产亚州精品女人久久久久久| 久久99精品久久久久久水蜜桃| 日本高清无卡码一区二区久久 | 欧美黑人激情性久久| 久久九九亚洲精品| 日产精品久久久久久久| 91精品无码久久久久久五月天| 超级97碰碰碰碰久久久久最新| 国产亚洲美女精品久久久久狼| 无码任你躁久久久久久| 97久久超碰成人精品网站| 噜噜噜色噜噜噜久久| 久久精品男人影院| 久久偷看各类wc女厕嘘嘘| 久久亚洲国产精品123区| 色欲av伊人久久大香线蕉影院| 久久91精品综合国产首页| 狠狠88综合久久久久综合网| 亚洲国产美女精品久久久久∴ | 久久国产精品-久久精品| 国产69精品久久久久9999APGF| 久久综合九色综合欧美就去吻| 久久久精品免费国产四虎| 久久精品aⅴ无码中文字字幕不卡| 亚洲国产成人乱码精品女人久久久不卡| 国产成人久久精品激情| 蜜臀av性久久久久蜜臀aⅴ| 久久成人国产精品免费软件| 久久久久亚洲AV无码专区首JN| 久久久免费观成人影院| 天天影视色香欲综合久久| 无码国内精品久久人妻麻豆按摩| 久久久精品视频免费观看| 久久久久97国产精华液好用吗| 久久精品三级视频| 久久久精品久久久久久|