亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

boost.asio框架系列之socket編程

 更新時(shí)間:2022年06月18日 15:36:07   作者:天方  
這篇文章介紹了boost.asio框架系列之socket編程,文中通過(guò)示例代碼介紹的非常詳細(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;
    }

主要流程如下:

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

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

  • 通過(guò)read_some函數(shù)來(lái)讀數(shù)據(jù)

另外,還可以通過(guò)write_some來(lái)寫數(shù)據(jù),通過(guò)close來(lái)關(guān)閉socket連接(這里是通過(guò)釋放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;
    }

主要流程如下:

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

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

  • 通過(guò)遠(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相似,不過(guò)需要注意的是,由于c++中內(nèi)存需要自己管理,而asio框架也沒(méi)有提供任何管理機(jī)制,因此需要注意async_accept、async_send等函數(shù)的參數(shù)生命周期,切記不能在里面?zhèn)魅霔W兞康囊?。如果是堆變量,需要確保釋放,本例中我是通過(guò)share_ptr來(lái)實(shí)現(xiàn)的自動(dòng)釋放。

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

相關(guān)文章

  • C++中文件操作基礎(chǔ)詳解

    C++中文件操作基礎(chǔ)詳解

    這篇文章主要為大家詳細(xì)介紹了C++中的一些文件操作基礎(chǔ)詳解,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++有一定幫助,需要的可以參考一下
    2022-06-06
  • C語(yǔ)言中字符串常用函數(shù)strcat與strcpy的用法介紹

    C語(yǔ)言中字符串常用函數(shù)strcat與strcpy的用法介紹

    以下是對(duì)C語(yǔ)言中字符串常用函數(shù)strcat與strcpy的使用方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下
    2013-07-07
  • C++ 數(shù)據(jù)共享與保護(hù)

    C++ 數(shù)據(jù)共享與保護(hù)

    C++ 數(shù)據(jù)共享與保護(hù)的基本概念,包括標(biāo)識(shí)符的作用域與可見(jiàn)性,對(duì)象生存期,類數(shù)據(jù)的共享,類共享數(shù)據(jù)的保護(hù)。本篇文章就介紹C++ 數(shù)據(jù)共享與保護(hù),需要的朋友可以參考一下
    2021-10-10
  • C語(yǔ)言平衡二叉樹真題練習(xí)

    C語(yǔ)言平衡二叉樹真題練習(xí)

    平衡二叉樹又被稱為AVL樹(有別于AVL算法),且具有以下性質(zhì):它是一棵空樹或它的左右兩個(gè)子樹的高度差的絕對(duì)值不超過(guò)1,并且左右兩個(gè)子樹都是一棵平衡二叉樹。本文將詳解介紹一下平衡二叉樹的原理與實(shí)現(xiàn),需要的可以參考一下
    2022-04-04
  • C語(yǔ)言超全面講解字符串函數(shù)

    C語(yǔ)言超全面講解字符串函數(shù)

    字符串函數(shù)(String?processing?function)也叫字符串處理函數(shù),指的是編程語(yǔ)言中用來(lái)進(jìn)行字符串處理的函數(shù),如C,pascal,Visual以及LotusScript中進(jìn)行字符串拷貝,計(jì)算長(zhǎng)度,字符查找等的函數(shù)
    2022-06-06
  • C++?自增自減運(yùn)算符的實(shí)現(xiàn)示例

    C++?自增自減運(yùn)算符的實(shí)現(xiàn)示例

    本文主要介紹了C++?自增自減運(yùn)算符的實(shí)現(xiàn)示例,自增和自減運(yùn)算符在C++中主要用于循環(huán)語(yǔ)句中,使循環(huán)變量的值自動(dòng)+1或者-1,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • Eclipse中C++連接mysql數(shù)據(jù)庫(kù)

    Eclipse中C++連接mysql數(shù)據(jù)庫(kù)

    這篇文章主要為大家詳細(xì)介紹了Eclipse中C++連接mysql數(shù)據(jù)庫(kù) ,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • 探討編寫int strlen(char *strDest);不允許定義變量的問(wèn)題

    探討編寫int strlen(char *strDest);不允許定義變量的問(wèn)題

    本篇文章是對(duì)編寫int strlen(char *strDest);不允許定義變量的問(wèn)題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 簡(jiǎn)單實(shí)現(xiàn)C++復(fù)數(shù)計(jì)算器

    簡(jiǎn)單實(shí)現(xiàn)C++復(fù)數(shù)計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了C++簡(jiǎn)單實(shí)現(xiàn)復(fù)數(shù)計(jì)算器的的相關(guān)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • C++中靜態(tài)成員函數(shù)訪問(wèn)非靜態(tài)成員的實(shí)例

    C++中靜態(tài)成員函數(shù)訪問(wèn)非靜態(tài)成員的實(shí)例

    這篇文章主要介紹了C++中靜態(tài)成員函數(shù)訪問(wèn)非靜態(tài)成員的實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-07-07

最新評(píng)論