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;
}