boost.asio系列——socket编程
asio的主要用途還是用于socket編程,本文就以一個(gè)tcp的daytimer服務(wù)為例簡單的演示一下如何實(shí)現(xiàn)同步和異步的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;
????}
主要流程如下:
另外,還可以通過write_some來寫數(shù)據(jù),通過close來關(guān)閉socket連接(這里是通過釋放socket對(duì)象隱式釋放連接)。
服務(wù)器
服務(wù)器代碼如下:
????#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;
????}
主要流程如下:
異步服務(wù)器
前面的服務(wù)器是同步版本,在大并發(fā)的場景下一般需要用到異步socket。服務(wù)器的異步版本如下:
????#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;
????}
這個(gè)異步版本的邏輯倒不是很復(fù)雜,基本上和.net中傳統(tǒng)的異步socket相似,不過需要注意的是,由于c++中內(nèi)存需要自己管理,而asio框架也沒有提供任何管理機(jī)制,因此需要注意async_accept、async_send等函數(shù)的參數(shù)生命周期,切記不能在里面?zhèn)魅霔W兞康囊?/span>。如果是堆變量,需要確保釋放,本例中我是通過share_ptr來實(shí)現(xiàn)的自動(dòng)釋放。
更多的示例請(qǐng)參看asio官方文檔。
轉(zhuǎn)載于:https://www.cnblogs.com/TianFang/archive/2013/02/02/2890529.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的boost.asio系列——socket编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux并发控制之原子操作
- 下一篇: oracle9i在window serv