[Boost] ASIO學習筆記:hello_world

posted in: ASIO, boost, C/C++程式設計 | 0

ASIO為Boost中的一套網路函式庫,全名為asynchronous input/output,如同他的名稱,
這個函式庫的核心是在處理各種同步或非同步的問題。

要學習這套函式庫,其實最好是先從其官方的教學開始:
http://www.boost.org/doc/libs/1_49_0/doc/html/boost_asio.html

其實寫的還蠻不錯的,再來就是可以搭配以下幾個教學:
http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-started-with-boostasio?pg=2
http://en.highscore.de/cpp/boost/index.html

以下為一個最簡單的asio程序:

#include <boost/asio.hpp>
#include <iostream>
int main( int argc, char * argv[] ){       
           boost::asio::io_service io_service;      
           io_service.run();    
           std::cout < < "Hello world!" << std::endl;        
           return 0;
}

以上程序還沒有關係到網路,主要就只是在展示我們的程式跟OS系統操作權之間的轉移而已

其中io_service為我們的程式跟operating system’s I/O services的接口
而io_service.run()會將系統操作權交給OS,而我們的程式會一直block在這一行,直至所有非同步的工作已經完成

關於非同步,讓我們來看加入非同步操作情形來解釋:

#include <boost/asio.hpp> 
#include <iostream> 
 
void handler1(const boost::system::error_code &ec) 
{ 
  std::cout < < "5 s." << std::endl; 
} 
 
void handler2(const boost::system::error_code &ec) 
{ 
  std::cout << "10 s." << std::endl; 
} 
 
int main() 
{ 
  boost::asio::io_service io_service; 
  boost::asio::deadline_timer timer1(io_service, boost::posix_time::seconds(5)); 
  timer1.async_wait(handler1); 
  boost::asio::deadline_timer timer2(io_service, boost::posix_time::seconds(10)); 
  timer2.async_wait(handler2); 
  io_service.run(); 
  system("pause");
}

由以上程式可以看到,我們設置了2個callback handler給各別的timer,並且各別以非同步的方式在5秒跟10秒之後執行

要特別注意的是:第一個timer開始計時的時間點是在
boost::asio::deadline_timer timer1(io, boost::posix_time::seconds(5));
就開始計時了,並非從 timer1.async_wait(print) 才開始計時。

同理timer2也是

handler1跟handler2呼叫的時機點是在當 io_service.run();執行之後,
才有辦法將系統操控權交給OS讓其去呼叫handler來處理當各別timer等待完成之後該做些什麼工作

等到這些非同步的timer計時完畢之後,程式才有辦法從os中取回主動權而繼續由 io_service.run();往下執行

dorgon

dorgon

職業:LV3遊戲軟體工程師 為了追尋小時候玩遊戲的感動,而一頭栽入遊戲業界。 本來以撰寫遊戲劇本為主要志向,但回過神來才發現已經踏入程序猿的不歸路。 專長為client端跨平台遊戲開發架構與自動建置流程,主要使用引擎為cocos2d-x與UnrealEngine4。

More Posts - Website

Follow Me:
FacebookLinkedIn

有什麼想法嗎?請發表你的看法