boost 异步socket《Boost程序完全开发指南》
异步服务器端:
1 #include <iostream> 2 #include <boost/asio.hpp> 3 #include <boost/bind.hpp> 4 #include <boost/shared_ptr.hpp> 5 #include <boost/date_time/posix_time/posix_time.hpp> 6 7 //using namespace std; 8 using namespace boost::asio; 9 10 class server 11 { 12 private: 13 io_service &ios; 14 ip::tcp::acceptor acceptor; 15 typedef boost::shared_ptr<ip::tcp::socket> sock_pt;//定义了一个智能指针,指向socket对象,用来在回调函数中传递 16 public: 17 server(io_service& io):ios(io),acceptor(ios,ip::tcp::endpoint(ip::tcp::v4(),6688)) 18 {start();} 19 //启动异步接受连接,调用accepter的async_accept()函数 20 void start() 21 { 22 sock_pt sock(new ip::tcp::socket(ios)); 23 acceptor.async_accept(*sock,bind(&server::accept_handler,this,placeholders::error,sock)); 24 } 25 //发送数据 26 void accept_handler(const boost::system::error_code & ec,sock_pt sock) 27 { 28 if(ec) 29 { 30 return; 31 } 32 std::cout<<"client:"; 33 std::cout<<sock->remote_endpoint().address()<<std::endl; 34 sock->async_write_some(buffer("hello asio"),bind(&server::write_handler,this,placeholders::error));//异步发送数据,write_handler()异步调用函数 35 start();//发送完数据后,调用start()再次启动服务接受连接,否则完成数据发送后,io_service因没事件处理而结束运行。 36 } 37 //因为我们不需要再做更多的工作,可以直接实现一个空函数,这里输出一条消息 38 void write_handler(const boost::system::error_code &) 39 { 40 std::cout<<"send msg complete."<<std::endl; 41 } 42 43 }; 44 45 46 int main() 47 try 48 { 49 std::cout<<"server start."<<std::endl; 50 io_service ios; //io_service对象 51 server serv(ios); 52 ios.run(); 53 } 54 catch(std::exception& e) 55 { 56 std::cout<<e.what()<<std::endl; 57 }
同步客户端:
1 #include <iostream> 2 #include <boost/asio.hpp> 3 #include <vector> 4 #include <boost/bind.hpp> 5 #include <boost/function.hpp> 6 using namespace std; 7 using namespace boost; 8 using namespace boost::asio; 9 10 class a_timer 11 { 12 private: 13 int count,count_max; 14 function<void()> f; 15 deadline_timer t; 16 17 public: 18 template<typename F> 19 20 a_timer(io_service& ios,int x,F func):f(func),count_max(x),count(0),t(ios,posix_time::millisec(500)) 21 { 22 t.async_wait(bind(&a_timer::call_func,this,placeholders::error)); 23 } 24 void call_func(const system::error_code&) 25 { 26 if(count>=count_max) 27 { 28 return; 29 } 30 ++count; 31 f(); 32 t.expires_at(t.expires_at()+posix_time::millisec(500)); 33 t.async_wait(bind(&a_timer::call_func,this,placeholders::error)); 34 } 35 }; 36 37 void client(io_service & ios) 38 try 39 { 40 std::cout<<"client start."<<std::endl; 41 ip::tcp::socket sock(ios); 42 ip::tcp::endpoint ep(ip::address::from_string("127.0.0.1"),6688); 43 sock.connect(ep); 44 std::vector<char> str(100,0); 45 sock.read_some(buffer(str)); 46 std::cout<<"recive from"<<sock.remote_endpoint().address(); 47 std::cout<<&str[0]<<std::endl; 48 } 49 catch(std::exception& e) 50 { 51 std::cout<<e.what()<<endl; 52 } 53 54 int main() 55 { 56 io_service ios; 57 a_timer at(ios,5,bind(client,ref(ios))); 58 ios.run(); 59 }