最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

boost.asio框架系列之socket編程

 更新時(shí)間:2022年06月18日 15:36:07   作者:天方  
這篇文章介紹了boost.asio框架系列之socket編程,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

asio的主要用途還是用于socket編程,本文就以一個(gè)tcp的daytimer服務(wù)為例簡(jiǎn)單的演示一下如何實(shí)現(xiàn)同步和異步的tcp socket編程。

客戶端

客戶端的代碼如下:

    #include <iostream>
    #include <boost/array.hpp>
    #include <boost/asio.hpp>

    using boost::asio::ip::tcp;

    int main(int argc, char* argv[])
    {
        try
        {
            boost::asio::io_service io_service;
            tcp::endpoint end_point(boost::asio::ip::address::from_string("127.0.0.1"), 3200);

            tcp::socketsocket(io_service);
            socket.connect(end_point);

            for (;;)
            {
                boost::array<char, 128> buf;
                boost::system::error_code error;

                size_t len = socket.read_some(boost::asio::buffer(buf), error);

                if (error == boost::asio::error::eof)
                    break; // Connection closed cleanly by peer.
                else if (error)
                    throw boost::system::system_error(error); // Some other error.

                std::cout.write(buf.data(), len);
            }
        }
        catch (std::exception& e)
        {
            std::cerr << e.what() << std::endl;
        }

        return 0;
    }

主要流程如下:

  • 通過tcp::socket類定義一個(gè)tcp client對(duì)象socket

  • 通過connect函數(shù)連接服務(wù)器,打開socket連接。

  • 通過read_some函數(shù)來讀數(shù)據(jù)

另外,還可以通過write_some來寫數(shù)據(jù),通過close來關(guān)閉socket連接(這里是通過釋放socket對(duì)象隱式釋放連接)。

服務(wù)器

服務(wù)器代碼如下:

    #include <ctime>
    #include <iostream>
    #include <string>
    #include <boost/asio.hpp>

    using namespace boost;
    using boost::asio::ip::tcp;

    int main()
    {
        try
        {
            asio::io_service io_service;
            tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 3200));

            for (;;)
            {
                tcp::socket socket(io_service);
                acceptor.accept(socket);

                time_t now = time(0);
                std::string message = ctime(&now);

                system::error_code ignored_error;
                socket.write_some(asio::buffer(message), ignored_error);
            }
        }
        catch (std::exception& e)
        {
            std::cerr << e.what() << std::endl;
        }

        return 0;
    }

主要流程如下:

  • 通過tcp::acceptor類創(chuàng)建一個(gè)tcp server對(duì)象,并綁定端口(也可以不在構(gòu)造器中自動(dòng)綁定,而通過bind函數(shù)手動(dòng)綁定)

  • 通過accept函數(shù)獲取遠(yuǎn)端連接

  • 通過遠(yuǎn)端連接的write_some函數(shù)將數(shù)據(jù)發(fā)往客戶端

異步服務(wù)器

前面的服務(wù)器是同步版本,在大并發(fā)的場(chǎng)景下一般需要用到異步socket。服務(wù)器的異步版本如下:

    #include <ctime>
    #include <iostream>
    #include <string>
    #include <memory>
    #include <functional>
    #include <boost/asio.hpp>

    using boost::asio::ip::tcp;
    using namespace std;

    void process_client(shared_ptr<tcp::socket> client)
    {
        time_t now = time(0);
        shared_ptr<string> message(new string(ctime(&now)));

        auto callback = [=](const boost::system::error_code& err ,size_t size)
        {
            if ((int)size == message->length())
                cout << "write completed" << endl;
        };

        client->async_send(boost::asio::buffer(*message), callback);
    }

    typedef function<void (const boost::system::error_code&)> accept_callback;
    void start_accept(tcp::acceptor& server)
    {
        shared_ptr<tcp::socket> client(new tcp::socket(server.get_io_service()));
        accept_callback callback = [&server, client](const boost::system::error_code& error)
            {
                if (!error)
                    process_client(client);

                start_accept(server);
            };

        server.async_accept(*client, callback);
    }

    int main()
    {
        try
        {
            boost::asio::io_service io_service;
            tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 3200));
            start_accept(acceptor);
            io_service.run();
        }
        catch (std::exception& e)
        {
            std::cerr << e.what() << std::endl;
        }
        return 0;
    }

這個(gè)異步版本的邏輯倒不是很復(fù)雜,基本上和.net中傳統(tǒng)的異步socket相似,不過需要注意的是,由于c++中內(nèi)存需要自己管理,而asio框架也沒有提供任何管理機(jī)制,因此需要注意async_accept、async_send等函數(shù)的參數(shù)生命周期,切記不能在里面?zhèn)魅霔W兞康囊?。如果是堆變量,需要確保釋放,本例中我是通過share_ptr來實(shí)現(xiàn)的自動(dòng)釋放。

到此這篇關(guān)于boost.asio框架系列之socket編程的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語言 數(shù)據(jù)結(jié)構(gòu)與算法之字符串詳解

    C語言 數(shù)據(jù)結(jié)構(gòu)與算法之字符串詳解

    這篇文章將帶大家深入了解C語言數(shù)據(jù)結(jié)構(gòu)與算法中的字符串,文中主要是介紹了字符串的定義、字符串的比較以及一些串的抽象數(shù)據(jù)類型,感興趣的可以學(xué)習(xí)一下
    2022-01-01
  • C++中函數(shù)模板的用法詳細(xì)解析

    C++中函數(shù)模板的用法詳細(xì)解析

    所謂函數(shù)模板實(shí)際上是建立一個(gè)通用函數(shù),其涵涵素類型額形參類型不具體指定,用一個(gè)虛擬的類型來代表,這個(gè)通用函數(shù)就稱為函數(shù)模板
    2013-10-10
  • Opencv實(shí)現(xiàn)綠幕視頻背景替換功能

    Opencv實(shí)現(xiàn)綠幕視頻背景替換功能

    這篇文章主要為大家詳細(xì)介紹了Opencv實(shí)現(xiàn)綠幕視頻背景替換功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • 數(shù)據(jù)結(jié)構(gòu)與算法中二叉樹子結(jié)構(gòu)的詳解

    數(shù)據(jù)結(jié)構(gòu)與算法中二叉樹子結(jié)構(gòu)的詳解

    這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)與算法中二叉樹子結(jié)構(gòu)的詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • C++實(shí)現(xiàn)LeetCode(904.水果裝入果籃)

    C++實(shí)現(xiàn)LeetCode(904.水果裝入果籃)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(904.水果裝入果籃),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Unity3D實(shí)現(xiàn)經(jīng)典小游戲Pacman

    Unity3D實(shí)現(xiàn)經(jīng)典小游戲Pacman

    這篇文章主要介紹了基于Unity3D制作一做個(gè)經(jīng)典小游戲Pacman,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Unity3D有一定的幫助,感興趣的小伙伴可以了解一下
    2021-12-12
  • C++面經(jīng)之什么是RAII面試問題解析

    C++面經(jīng)之什么是RAII面試問題解析

    這篇文章主要介紹了C++面經(jīng)之什么是RAII面試問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • C/C++ 獲取Windows系統(tǒng)的位數(shù)32位或64位的實(shí)現(xiàn)代碼

    C/C++ 獲取Windows系統(tǒng)的位數(shù)32位或64位的實(shí)現(xiàn)代碼

    這篇文章主要介紹了C/C++ 獲取Windows系統(tǒng)的位數(shù)32位或64位的實(shí)現(xiàn)代碼的相關(guān)資料,希望通過本文能幫助到大家,讓大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-10-10
  • C語言實(shí)現(xiàn)三子棋程序

    C語言實(shí)現(xiàn)三子棋程序

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)三子棋程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 深入解析C++中的引用類型

    深入解析C++中的引用類型

    引用指的是對(duì)一個(gè)對(duì)象的引用。那么什么是對(duì)象?在c++中狹義的對(duì)象指的是用類,結(jié)構(gòu),聯(lián)合等復(fù)雜數(shù)據(jù)類型來聲明的變量,如 MyClass myclass,CDialog mydlg,等等
    2013-09-09

最新評(píng)論

高州市| 海原县| 临沂市| 天峨县| 长治市| 保靖县| 溧水县| 元朗区| 巨野县| 邛崃市| 南木林县| 西昌市| 高雄市| 河津市| 阿巴嘎旗| 涡阳县| 清苑县| 兴仁县| 南靖县| 广宗县| 县级市| 边坝县| 桐乡市| 西宁市| 渭南市| 泌阳县| 西安市| 桃源县| 盐津县| 南投县| 衡山县| 凤山县| 彭州市| 津市市| 青河县| 于都县| 玉田县| 卢氏县| 古田县| 揭东县| 南京市|