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直接完成這三個動作。