boost::asio是一個高性能的網(wǎng)絡(luò)開發(fā)庫,Windows下使用IOCP,Linux下使用epoll。與ACE不同的是,它并沒有提供一個網(wǎng)絡(luò)框架,而是采取組件的方式來提供應(yīng)用接口。但是對于常見的情況,采用一個好用的框架還是能夠簡化開發(fā)過程,特別是asio的各個異步接口的用法都相當(dāng)類似。
受到
SP Server 框架的影響,我使用asio大致實(shí)現(xiàn)了一個多線程的半異步半同步服務(wù)器框架,以下是利用它來實(shí)現(xiàn)一個Echo服務(wù)器:
1. 實(shí)現(xiàn)回調(diào):
static void onSessionStarted(RequestPtr const& request, ResponsePtr const& response) {
request->setReadMode(Session::READ_LN); // 設(shè)置為行讀取
}

static void onSession(RequestPtr const& request, ResponsePtr const& response) {
print(request->message()); //打印收到的消息
response->addReply(request->message()); //回送消息
response->close();
}

說明:close()是一個關(guān)閉請求,它并不馬上關(guān)閉Session,而是等待所有與該Session相關(guān)的異步操作全部結(jié)束后才關(guān)閉。
2. 一個單線程的Echo服務(wù)器:
void server_main() {
unsigned short port = 7;
AsioService svc;
AsioTcpServer tcp(svc, port);
svc.callbacks().sessionStarted = &onSessionStarted;
svc.callbacks().sessionHandle = &onSession;
svc.run();
}
3. 一個多線程的Echo服務(wù)器(半異步半同步:一個主線程,4個工作者線程)
void server_main2() {
unsigned short port = 7;
int num_threads = 4;
AsioService svc;
AsioService worker(AsioService::HAS_WORK);
AsioTcpServer tcp(svc, port);
svc.callbacks().sessionStarted = worker.wrap(&onSessionStarted);
svc.callbacks().sessionHandle = worker.wrap(&onSession);
AsioThreadPool thr(worker, num_threads);
svc.run();
}
有了這樣一個思路,實(shí)現(xiàn)起來就很容易了。重點(diǎn)是以下兩點(diǎn):
1。緩沖區(qū)的管理與內(nèi)存池的使用
?。病榱吮WCSession的線程安全,必須要設(shè)置一個掛起狀態(tài)。
還有一個好處,就是完全隔絕了asio的應(yīng)用接口,不用再忍受asio漫長的編譯時間了。代碼就不貼在這里了,有興趣的可以通過email 探討。(說明,這里只提出一個思路,不再提供源代碼,請各位見諒)
原文地址:
http://www.shnenglu.com/eXile/