boost - socket通信

 備忘使用

 

  1. #include <boost/bind.hpp> 
  2. #include <boost/asio.hpp> 
  3. #include <boost/thread.hpp> 
  4. using boost::asio::io_service; 
  5. using boost::asio::ip::tcp; 
  6. using boost::system::error_code; 
  7. using boost::asio::deadline_timer; 
  8. using boost::asio::buffer; 
  9.  
  10. class MyNet 
  11. public
  12.     void Accept(unsigned short port, boost::function<void ()> fun) 
  13.     { 
  14.         _pAcceptor = new tcp::acceptor(_ios, tcp::endpoint(tcp::v4(), port)); 
  15.         _pTimer = new deadline_timer(_ios); 
  16.      _pClentSkt = new tcp::socket(_ios); 
  17.         _pAcceptor->async_accept(*_pClentSkt, 
  18.         boost::bind(&MyNet::AcceptHandle, this,  
  19.          boost::asio::placeholders::error, //傳遞錯誤碼
  20. fun//傳遞一個函數指針
  21. )); 
  22.         _ios.reset(); //充值事件循環狀態
  23.         if (_ios.run() == 0) //啓動事件循環
  24.         { 
  25.          throw std::runtime_error("io_service run return 0."); 
  26.         } 
  27.     } 
  28.     void Send(const string& data) 
  29.     { 
  30.      _pClentSkt->write_some(buffer(data, data.size())); 
  31.     } 
  32.     string Recv() 
  33.     {
  34.         _ret = _pClentSkt->read_some(buffer(_buf, 1024)); 
  35.         return string(_buf, _ret); 
  36.     } 
  37.     void Close() 
  38.     { 
  39.         _mutex.lock(); 
  40.         _pAcceptor->close(); 
  41.         _pClentSkt->shutdown(tcp::socket::shutdown_both); 
  42.         _pClentSkt->close(); 
  43.         _ios.stop(); 
  44.         _mutex.unlock(); 
  45.     } 
  46.     string GetClientIp() 
  47.     {//獲得客戶端的ip 
  48.         boost::asio::ip::tcp::endpoint ep = _pClentSkt->remote_endpoint(); 
  49.         return ep.address().to_string(); 
  50.     } 
  51.     unsigned short GetPort() 
  52.     {//獲得監控的端口
  53.         return _pAcceptor->local_endpoint().port(); 
  54.     } 
  55.     static unsigned short GetLocalValidPort() 
  56.     {//隨機過去一個本機的可用端口
  57.         io_service ios; 
  58.         tcp::acceptor acceptor(ios, tcp::endpoint(tcp::v4(), 0)); 
  59.         tcp::acceptor::endpoint_type et = acceptor.local_endpoint(); 
  60.         return et.port(); 
  61.     } 
  62.     static string GetLocalIp() 
  63.     {//獲取本機ip
  64.         boost::asio::io_service io_service; 
  65.         tcp::resolver resolver(io_service); 
  66.         tcp::resolver::query query(boost::asio::ip::host_name(), ""); 
  67.         tcp::resolver::iterator iter = resolver.resolve(query); 
  68.         tcp::resolver::iterator end; // End marker. 
  69.         if (iter != end) 
  70.         { 
  71.             tcp::endpoint ep = *iter; 
  72.          return ep.address().to_string(); 
  73.      } 
  74.     } 
  75.     ~MyNet(void
  76.     { 
  77.         delete _pTimer; 
  78.         delete _pAcceptor; 
  79.         delete _pClentSkt; 
  80.     } 
  81. protected
  82.     void AcceptHandle(const error_code& error, boost::function<void ()> fun) 
  83.     {//異步接收連接的回調函數
  84.         if (error) 
  85.             return
  86.         //傳遞進來的函數指針fun未用到,本來是爲了啓動此函數的線程,boost::thread trd(fun); 
  87.     } 
  88.  
  89. private
  90.     io_service _ios; 
  91.     tcp::acceptor* _pAcceptor; 
  92.     tcp::socket* _pClentSkt; 
  93.     tcp::socket* _pClentTmp; 
  94.     deadline_timer* _pTimer; 
  95.     char _buf[1024]; 
  96.     size_t _ret; 
  97.     static string _ip; 
  98.     boost::mutex _mutex; 
  99. }; 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章