libevent入門(1)

libevent是什麼  
     
        libevent 庫實際上沒有更換  select()poll() 或其餘機制的基礎。而是使用對於每一個平臺最高效的高性能解決方案在實現外加上一個包裝器。
        爲了實際處理每一個請求,libevent 庫提供一種事件機制,它做爲底層網絡後端的包裝器。事件系統讓爲鏈接添加處理函數變得很是簡便,同時下降了底層 I/O 複雜性。這是 libevent 系統的核心。
        通俗的說,libevent是select、poll、epoll等機制的一種封裝,使網絡編程更方便、減低網絡編程的複雜性。
 
        libevent有如下特色:
        可移植性:
        使用libevent庫編寫的程序能夠運行在全部支持libevent的平臺,即時是在不支持非阻塞IO的平臺上,libevent庫也能夠支持通常的IO工做方法。
        高效:
        使用libevent庫編寫的程序會使用每一個平臺最高效的非阻塞IO模型,而不是引入過多的其餘的IO機制。
        伸縮性強:
        使用libevent庫編寫的程序能夠處理大量的網絡鏈接。
        便捷性:
        libevent是對底層IO機制的封裝,能夠編寫統一的程序,下降IO程序編寫的複雜性。
 
怎麼使用 libevent
        
        libevent整體API調用過程以下:
        (1)event_base_new()  //初始化一個event_base
        (2)event_set()  //初始化一個event(事件)結構體,設置事件的文件描述符、事件類型(讀IO事件或者寫IO事件等)、事件被觸發後的回調函數、回調函數的參數
        (3)event_base_set()  //給事件設置相應的event_base
        (4)event_add()  //把事件添加到隊列(就緒隊列、active隊列等),隊列由event對應的event_base管理
        (5)event_base_dispatch()  //啓動輪詢
 
        event_base和event是一對多的關係,一個event_base管理着多個event。
 1 int main() 
 2 { 
 3    
 4     int serFd;   
 5     struct sockaddr_in serAddr; 
 6                  
 7     memset(&serAddr, 0, sizeof(serAddr));   
 8     serAddr.sin_family = AF_INET;   
 9     serAddr.sin_addr.s_addr = inet_addr("127.0.0.1");     
10     serAddr.sin_port = htons(8888);    
11                                
12        
13     serFd = socket(AF_INET, SOCK_STREAM, 0);   
14     bind(serFd, (struct sockaddr*)&serAddr, sizeof(serAddr));   
15     listen(serFd, 10); 
16    
17     //初始化一個event_base
18     base = event_base_new(); 
19        
20     struct event listenEvent; 
21 
22     //初始化一個event(事件)結構體,設置事件的文件描述符、事件類型(讀IO事件或者寫IO事件等)、
23     //事件被觸發後的回調函數onAccept【該函數須要咱們本身實現】、回調函數的參數
24     //EV_PERSIST表示事件的回調函數執行完後,不會把事件listenEvent從base中移除
25     event_set(&listenEvent, serFd, EV_READ|EV_PERSIST, onAccept, NULL); 
26    
27     //給listenEvent事件設置相應的event_base
28     event_base_set(base, &listenEvent); 
29 
30      //把事件添加到隊列(就緒隊列、active隊列等),隊列由event對應的event_base管理
31     event_add(&listenEvent, NULL); 
32        
33     //啓動輪詢
34     event_base_dispatch(base); 
35    
36     return 0; 
37 }

    回調函數:編程

1 //回調函數包含三個參數
2 //參數1:事件對應的文件描述符
3 //參數2:事件對應的行爲 EV_READ|EV_PERSIST
4 //參數3:在event_set函數傳入的參數的指針
5 void onAccept(int serFd, short iEvent, void *arg) 
6 { 
7     //listenEvent事件的回調函數
8 } 
相關文章
相關標籤/搜索