【Boost】boost库asio详解8——TCP的简单例子1
生活随笔
收集整理的這篇文章主要介紹了
【Boost】boost库asio详解8——TCP的简单例子1
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
摘于boost官網的幾個例子, 做了點小修改, 筆記之.
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());?? ????}?? }?? 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;?? ????}?? }?? 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;?? ????}?? } ?
同步客戶端
[cpp]?view plain?copy ?print?同步服務端
[cpp]?view plain?copy ?print?異步服務端
[cpp]?view plain?copy ?print?總結
以上是生活随笔為你收集整理的【Boost】boost库asio详解8——TCP的简单例子1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Boost】boost库asio详解7
- 下一篇: 【Boost】boost库asio详解9