Boost asio基本概念


  asio庫基於操作系統提供的異步機制,采用前攝器模式(Proactor)實現可移植的異步(或同步)IO操作,不需要使用多線程和鎖,有效避免多線程編程帶來的諸多有害副作用(如競爭,死鎖)。

  asio封裝了操作系統的select、kqueue、poll/epoll、overlapped I/O等機制,實現異步IO模型。在同步模式下,程序發起一個IO操作,向io_service提交請求,io_service把操作轉交給操作系統,同步地等待。當IO操作完成時,操作系統通知io_service,然后io_service再把結果發回給程序,完成整個同步流程。在異步模式下,程序除了要發起IO操作,還要定義一個用於回調的完成處理函數。io_service同樣把IO操作轉交給操作系統執行,但它不同步等待,而是立即返回。調用io_service的run()成員函數可以等待異步操作完成,當異步操作完成時io_service從操作系統獲取結果,在調用handler執行后續邏輯。

1. handler

  回調函數形式:

void handler(const error_code &ec);
void handler(const error_code &ec, std::size_type bytes_transferred);

2. io_service

  io_service類代表了系統里的異步處理機制(如epoll),必須在asio庫里的其他對象之前初始化,其他對象則向io_service提交異步操作handler。

3. const_buffer

  數據緩沖區,保存了一個void*的內存地址和數據長度。

4. 網絡通信相關

  asio支持TCP、UDP和ICMP通信協議,很好的封裝了伯克利socket api。其中TCP部分定義了一些用於TCP通信的typedef類型,包括端點類endpoint、套接字類socket、流類iostream,以及接收器acceptor、解析器resolver等。 

class tcp
{
public:
  /// The type of a TCP endpoint.
  typedef basic_endpoint<tcp> endpoint;
  /// The TCP socket type.
  typedef basic_stream_socket<tcp> socket;
  /// The TCP acceptor type.
  typedef basic_socket_acceptor<tcp> acceptor;
  /// The TCP resolver type.
  typedef basic_resolver<tcp> resolver;
  /// The TCP iostream type.
  typedef basic_socket_iostream<tcp> iostream;
  /// ......
};

  endpoint包含IP地址和通信用的端口號。

  socket可以在構造時指定使用的協議或者endpoint,或者稍后調用成員函數connect()。連接成功后可以用local_endpoint()和remote_endpoint()獲得連接兩端的端點信息,用available()獲取可讀取的字節數,用receive()/read_some()和send()/write_some()讀寫數據,當操作完成后使用close()函數關閉socket。如果socket沒有被關閉,則其析構時也會自動關閉。

  acceptor對應Socket API的accept()函數,用於服務器端。acceptor可以像傳統socket API一樣使用,open()打開端口,bind()綁定再用listen()偵聽端口,但更方便的是使用它的構造函數,傳入endpoint直接完成這三個動作。

  實現例子:使用Boost asio實現同步的TCP/IP通信使用Boost asio實現異步的TCP/IP通信


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM