日韩性视频-久久久蜜桃-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编程的全部內容,希望文章能夠幫你解決所遇到的問題。

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