中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

boost.asio框架系列之socket編程怎么實現

發布時間:2022-06-20 09:27:53 來源:億速云 閱讀:167 作者:iii 欄目:開發技術

這篇“boost.asio框架系列之socket編程怎么實現”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“boost.asio框架系列之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類定義一個tcp client對象socket

  • 通過connect函數連接服務器,打開socket連接。

  • 通過read_some函數來讀數據

另外,還可以通過write_some來寫數據,通過close來關閉socket連接(這里是通過釋放socket對象隱式釋放連接)。

服務器

服務器代碼如下:

    #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類創建一個tcp server對象,并綁定端口(也可以不在構造器中自動綁定,而通過bind函數手動綁定)

  • 通過accept函數獲取遠端連接

  • 通過遠端連接的write_some函數將數據發往客戶端

異步服務器

前面的服務器是同步版本,在大并發的場景下一般需要用到異步socket。服務器的異步版本如下:

    #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;
    }

這個異步版本的邏輯倒不是很復雜,基本上和.net中傳統的異步socket相似,不過需要注意的是,由于c++中內存需要自己管理,而asio框架也沒有提供任何管理機制,因此需要注意async_accept、async_send等函數的參數生命周期,切記不能在里面傳入棧變量的引用。如果是堆變量,需要確保釋放,本例中我是通過share_ptr來實現的自動釋放。

以上就是關于“boost.asio框架系列之socket編程怎么實現”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

都匀市| 井研县| 宁河县| 五家渠市| 佛坪县| 蕲春县| 三都| 集贤县| 张掖市| 武义县| 苗栗县| 邵武市| 防城港市| 博兴县| 岑溪市| 安庆市| 乡宁县| 垫江县| 广元市| 大化| 保山市| 灵武市| 山阳县| 涪陵区| 福海县| 陆丰市| 临沭县| 双城市| 门头沟区| 满城县| 延边| 肇庆市| 湘潭县| 宝清县| 噶尔县| 百色市| 凤阳县| 敦化市| 凤冈县| 繁昌县| 远安县|