1. 程式人生 > >boost::asio::socket

boost::asio::socket

         boost的網路層在windows平臺下是用iocp實現的,boost為了能夠實現非同步,實際上是利用了回撥機制,就是在凡是會阻塞程式的函式accpet,recv,send中加入了一個回撥函式作為引數,這樣,程式儘管執行,所有其他操作由回撥來完成,相對於boost中同步函式accept,read_some,write_some.在相對應的非同步呼叫函式async_accept,async_read_some,async_write_some等函式中加入了一個函式引數作為回撥用。這樣在一個執行緒中也可以完成多個連線的接收,讀,寫任務了。也不用使用其他的網路模型,select,asyncselect等等。

一個簡單的非同步server端,摘抄自: <boost程式庫完全開發指南>一書

#include <iostream>
using namespace std;

#pragma comment(lib, "E:\\Boost\\lib\\libboost_date_time-vc90-mt-sgd-1_54.lib")//必須使用的三個庫
#pragma comment(lib, "E:\\Boost\\lib\\libboost_system-vc90-mt-sgd-1_54.lib")
#pragma comment(lib, "E:\\Boost\\lib\\libboost_regex-vc90-mt-sgd-1_54.lib")

#include <boost/asio.hpp>
#include <boost/shared_ptr.hpp> //使用智慧指標管理接收到的socket連線
#include <boost/bind.hpp> //包裝函式
using namespace boost::asio;


class server
{
private:
   io_service& io;
   ip::tcp::acceptor acceptor;
   typedef boost::shared_ptr<ip::tcp::socket> pSocket;


   void start()
   {
           pSocket  sock(new ip::tcp::socket(io));
           acceptor.async_accept(*sock , boost::bind(&server::accept_handler,this,placeholders::error,sock));
   }
   void accept_handler(const boost::system::error_code& ec, pSocket sock)
   {
           if (ec)
           {
               return;
           }
           cout<<"client:"<<sock->remote_endpoint().address()<<" "<<sock->remote_endpoint().port()<<endl;
           sock->async_write_some(buffer("hello world"),boost::bind(&server::write_handler, this, placeholders::error));
           start();
    }
   void write_handler(const boost::system::error_code&)
   {
           cout<<"send complete"<<endl;
   }
public:
   server(io_service& ios):io(ios),acceptor(io,ip::tcp::endpoint(ip::tcp::v4(), 6688))
   {
          start();
   }

};
int _tmain(int argc, _TCHAR* argv[])
{
     cout<<"**************Server Start****************"<<endl;
     io_service io;
     server ser(io);
     io.run();
     return 0;
}