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_base18 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_base28 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_PERSIST4 //參數3:在event_set函數傳入的參數的指針5 void onAccept(int serFd, short iEvent, void *arg) 6 { 7 //listenEvent事件的回調函數8 }
新聞熱點
疑難解答