<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
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來實現的自動釋放。
到此這篇關於boost.asio框架系列之socket程式設計的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45