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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【Boost】boost库asio详解8——TCP的简单例子1

發布時間:2024/4/11 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Boost】boost库asio详解8——TCP的简单例子1 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
摘于boost官網的幾個例子, 做了點小修改, 筆記之.

同步客戶端

[cpp]?view plain?copy ?print?
  • void?test_asio_synclient()??
  • {??
  • ????typedef?boost::asio::io_service?IoService;??
  • ????//?該命名空間下有幾個常用類:?accetpt,?resolver,?endpoint,?socket??
  • ????typedef?boost::asio::ip::tcp?TCP;??
  • ??
  • ????try??
  • ????{??
  • ????????IoService?ios;??
  • ????????boost::system::error_code?error;??
  • ??
  • ????????//?1.?用解釋器的方法,?常用來解析域名,?如??
  • ????????//?query("www.163.com","80"),?也可以?query("www.163.com","telnet")??
  • ????????//?echo??????????7/tcp??
  • ????????//?ftp???????????21/tcp?????????????????#?File?Transfer?Protocol?(Control)??
  • ????????//?telnet????????23/tcp?????????????????#?Virtual?Terminal?Protocol??
  • ????????//?smtp??????????25/tcp?????????????????#?Simple?Mail?Transfer?Protocol??
  • ????????//?time??????????37/tcp??timeserver?????#?Time??
  • //??????TCP::resolver?resolver(ios);??
  • //??????TCP::resolver::query?query("127.0.0.1",?"10000");??
  • //??????TCP::resolver::iterator?endpoint_iterator?=?resolver.resolve(query);??
  • //??????TCP::resolver::iterator?end;??
  • //??????TCP::socket?socket(ios);??
  • //??????socket.connect(*endpoint_iterator,?error);??
  • ??
  • ????????//?2.?用簡便的方法??
  • ????????TCP::socket?socket(ios);??
  • ????????TCP::endpoint?endpoint(boost::asio::ip::address_v4::from_string("127.0.0.1"),?10000);??
  • ????????socket.connect(endpoint,?error);??
  • ??
  • ????????//?這里要判斷一下,?否則沒有連上會通過.??
  • ????????if?(error)??
  • ????????????throw?boost::system::system_error(error);??
  • ??????
  • ????????while(true)??
  • ????????{??
  • ????????????//?boost::array<char,?128>?buf;??
  • ????????????std::vector<char>?buf(128);??
  • ????????????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.??
  • ??????????????
  • ????????????//?buf要注意控制大小。??
  • ????????????socket.write_some(boost::asio::buffer(buf,?len),?error);??
  • ????????}??
  • ????}??
  • ????catch?(std::exception&?e)??
  • ????{??
  • ????????PRINT_DEBUG(e.what());??
  • ????}??
  • }??
  • 同步服務端

    [cpp]?view plain?copy ?print?
  • namespace??
  • {??
  • ????std::string?make_daytime_string()??
  • ????{??
  • ????????using?namespace?std;?//?For?time_t,?time?and?ctime;??
  • ????????time_t?now?=?time(0);??
  • ????????return?ctime(&now);??
  • ????}??
  • }??
  • ??
  • void?test_asio_synserver()??
  • {??
  • ????typedef?boost::asio::io_service?IoService;??
  • ????typedef?boost::asio::ip::tcp?TCP;??
  • ??
  • ????try??
  • ????{??
  • ????????IoService?ios;??
  • ????????/*?
  • ????????????*以下構造函數相當于以下步驟?
  • ????????????*?basic_socket_acceptor<tcp>?acceptor(io_service);?
  • ????????????*?acceptor.open(tcp::v4());?
  • ????????????*?acceptor.bind(tcp::endpoint(13));?
  • ????????????*?acceptor.listen(0);//default??
  • ????????*/??
  • ????????/*?
  • ????????????tcp::endpoint(端點)由以下三個部分組成?
  • ????????????1.?IP地址(address,?address_v4,?address_v6)?
  • ????????????2.?端口號?
  • ????????????3.?協議版本?
  • ????????*/??
  • ????????TCP::acceptor?acceptor(ios,?TCP::endpoint(TCP::v4(),?13));??
  • ????????for?(;;)??
  • ????????{??
  • ????????????TCP::socket?socket(ios);??
  • ????????????acceptor.accept(socket);??
  • ????????????std::string?message?=?make_daytime_string();??
  • ??
  • ????????????boost::system::error_code?ignored_error;??
  • ????????????boost::asio::write(socket,??
  • ???????????????????????????????boost::asio::buffer(message),???
  • ???????????????????????????????boost::asio::transfer_all(),???
  • ???????????????????????????????ignored_error);??
  • ????????????PRINT_DEBUG(message);??
  • ????????}??
  • ????}??
  • ????catch?(std::exception&?e)??
  • ????{??
  • ????????std::cout?<<?e.what()?<<?std::endl;??
  • ????}??
  • }??
  • 異步服務端

    [cpp]?view plain?copy ?print?
  • namespace??
  • {??
  • ????typedef?boost::asio::io_service?IoService;??
  • ????typedef?boost::asio::ip::tcp?TCP;??
  • ??
  • ????std::string?make_daytime_string()??
  • ????{??
  • ????????using?namespace?std;??
  • ????????time_t?now?=?std::time(NULL);??
  • ????????return?ctime(&now);??
  • ????}??
  • ??
  • ????class?tcp_connection??
  • ????????:?public?boost::enable_shared_from_this<tcp_connection>??
  • ????{??
  • ????public:??
  • ????????typedef?boost::shared_ptr<tcp_connection>?pointer;??
  • ??
  • ????????static?pointer?create(IoService&?io_service)??
  • ????????{??
  • ????????????return?pointer(new?tcp_connection(io_service));??
  • ????????}??
  • ??
  • ????????TCP::socket&?socket()??
  • ????????{??
  • ????????????return?socket_;??
  • ????????}??
  • ??
  • ????????void?start()??
  • ????????{??
  • ????????????message_?=?make_daytime_string();??
  • ??
  • ????????????boost::asio::async_write(??
  • ????????????????socket_,???
  • ????????????????boost::asio::buffer(message_),???
  • ????????????????boost::bind(&tcp_connection::handle_write,???
  • ????????????????????????????shared_from_this(),???
  • ????????????????????????????boost::asio::placeholders::error,???
  • ????????????????????????????boost::asio::placeholders::bytes_transferred));??
  • ????????}??
  • ????private:??
  • ????????tcp_connection(IoService&?io_service)??
  • ????????????:?socket_(io_service)??
  • ????????{??
  • ????????}??
  • ??
  • ????????void?handle_write(const?boost::system::error_code&?/*error*/,??
  • ????????????size_t?/*bytes_transferred*/)??
  • ????????{??
  • ????????????PRINT_DEBUG("write?data!!!");??
  • ????????}??
  • ??
  • ????????TCP::socket?socket_;??
  • ????????std::string?message_;??
  • ????};??
  • ??
  • ????class?tcp_server??
  • ????{??
  • ????public:??
  • ????????tcp_server(IoService&?io_service)??
  • ????????????:?acceptor_(io_service,?TCP::endpoint(TCP::v4(),?10000))??
  • ????????{??
  • ????????????start_accept();??
  • ????????}??
  • ????private:??
  • ????????void?start_accept()??
  • ????????{??
  • ????????????tcp_connection::pointer?new_connection?=??
  • ????????????????tcp_connection::create(acceptor_.get_io_service());??
  • ??????????????
  • ????????????acceptor_.async_accept(??
  • ????????????????new_connection->socket(),???
  • ????????????????boost::bind(&tcp_server::handle_accept,???
  • ????????????????????????????this,???
  • ????????????????????????????new_connection,???
  • ????????????????????????????boost::asio::placeholders::error));??
  • ????????}??
  • ??
  • ????????void?handle_accept(tcp_connection::pointer?new_connection,??
  • ????????????const?boost::system::error_code&?error)??
  • ????????{??
  • ????????????if?(!error)??
  • ????????????{??
  • ????????????????new_connection->start();??
  • ????????????????start_accept();??
  • ????????????}??
  • ????????}??
  • ??
  • ????????TCP::acceptor?acceptor_;??
  • ????};??
  • }??
  • ??
  • //?tcp_connection與tcp_server封裝后??
  • void?test_asio_asynserver()??
  • {??
  • ????try??
  • ????{??
  • ????????IoService?io_service;??
  • ????????tcp_server?server(io_service);??
  • ??
  • ????????//?只有io_service類的run()方法運行之后回調對象才會被調用??
  • ????????io_service.run();??
  • ????}??
  • ????catch?(std::exception&?e)??
  • ????{??
  • ????????std::cerr?<<?e.what()?<<?std::endl;??
  • ????}??
  • } ?

  • 總結

    以上是生活随笔為你收集整理的【Boost】boost库asio详解8——TCP的简单例子1的全部內容,希望文章能夠幫你解決所遇到的問題。

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