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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

boost.asio系列——socket编程

發布時間:2025/4/16 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 boost.asio系列——socket编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

asio的主要用途還是用于socket編程,本文就以一個tcp的daytimer服務為例簡單的演示一下如何實現同步和異步的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類定義一個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來實現的自動釋放。

    更多的示例請參看asio官方文檔。

    轉載于:https://www.cnblogs.com/TianFang/archive/2013/02/02/2890529.html

    《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的boost.asio系列——socket编程的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 欧美日韩色综合 | 欧洲在线观看 | 国产精品一区二区无线 | 男人的天堂网av | 一级毛片黄片 | 韩国av永久免费 | 视频精品一区 | 四虎av影视 | 亚洲区 欧美区 | 貂蝉被到爽流白浆在线观看 | 亚洲影视一区二区 | 69热在线观看 | av色站 | 国产日韩不卡 | 男女扒开双腿猛进入爽爽免费 | 成人精品视频一区 | 国内精品久久久久 | 四虎成人在线观看 | 日韩av在线一区二区 | 激情视频在线播放 | 亚洲视频在线观看免费视频 | 欧美怡红院视频一区二区三区 | 婷婷六月综合网 | 国产第一网站 | 国产三级三级在线观看 | 欧美一级黄色片网站 | 国产精品另类 | 日韩一级免费毛片 | 国产成人久久77777精品 | ass日本寡妇pics | 性欧美熟妇videofreesex | 成人免费毛片网 | 国产精品国产精品国产专区不卡 | 日本免费一区视频 | av网站在线观看不卡 | 成人综合精品 | 涩涩屋污 | 久久亚洲aⅴ无码精品 | 开心成人激情 | 无码国模国产在线观看 | 欧美在线你懂的 | 久久男人 | 色一情一乱一区二区三区 | 日韩 欧美 中文 | 亚洲av成人精品一区二区三区在线播放 | 成人精品电影 | 成人免费视频毛片 | 琪琪电影午夜理论片八戒八戒 | 九九热这里只有精品6 | 久草福利资源在线 | 欧美成人片在线观看 | 精品一区在线播放 | 亚洲女则毛耸耸bbw 边吃奶边添下面好爽 | 黄色福利站 | 亚洲激情av | 国产传媒视频 | 男女无遮挡免费视频 | 国产欧美日韩中文字幕 | 欧美性生交大片免费看app麻豆 | 天堂中文视频在线 | 黄色高清视频 | 97色涩| www日韩视频 | 久久久老熟女一区二区三区91 | 97免费视频观看 | 中文字幕天堂av | 国产精品999999 | 一级欧美在线 | 日啪| 奇米影视亚洲 | 免费成人深夜夜视频 | 淫片在线 | 国产又粗又长又硬免费视频 | 成人动漫av在线 | 国产探花一区二区三区 | 在线免费观看日韩视频 | 久久综合中文 | 欧美精品国产一区二区 | 日本一区二区三区免费在线观看 | 看全黄大色黄大片 | 色男天堂 | 亚洲夜夜爽 | 老牛影视少妇在线观看 | 亚洲精品一区二区三区在线观看 | 日韩欧美成人网 | 亚洲爆乳无码一区二区三区 | 美女xx00 | 国产一区二区在线免费观看 | 男人天堂怡红院 | 一区二区三区视频在线 | 能看毛片的网站 | www久久| 人人妻人人澡人人爽欧美一区 | 四虎精品久久 | 欧美色xxx| 中文乱码人妻一区二区三区视频 | 牲欲强的熟妇农村老妇女视频 | 性做久久久久久免费观看 | a天堂在线观看视频 |