岳陽市委網(wǎng)站免費seo網(wǎng)站推廣在線觀看
libevent源碼學(xué)習(xí)筆記
- libevent安裝
- libevent源碼解析
- (1)事件對象
- (2)事件操作
- (3)事件循環(huán)
- (4)事件處理
- 常用指令
- 問題記錄
- 問題一:長連接的管理
- 問題二:連接關(guān)閉問題
- 問題三:客戶端與服務(wù)器端存在多個TCP連接,數(shù)據(jù)發(fā)送是依次的還是并行的?
libevent安裝
(1)解壓libevent壓縮包并進入到文件目錄下
·tar -zxvf libevent-2.1.12-stable.tar.gz
·cd libevent-2.1.12-stable.tar/
(2)運行./configure用于配置編譯選項和環(huán)境,由于系統(tǒng)中沒有OpenSSL庫,所以使用了–disable-openssl選項來禁用OpenSSL相關(guān)功能,減少依賴。
·./configure --disable-openssl
(3)運行make命令用于編譯源代碼并生成示例可執(zhí)行文件或庫文件。
(4)運行sudo make install用于安裝編譯生成的庫文件和頭文件到系統(tǒng)的標(biāo)準(zhǔn)位置,以便其他程序可以在編譯和鏈接時使用libevent.so庫。
libevent源碼解析
libevent是一個事件驅(qū)動的網(wǎng)絡(luò)編程庫,它提供了一種跨平臺的方式來處理I/O事件和定時器事件。libevent事件驅(qū)動的核心是reactor模式。reactor模式將IO事件、定時器事件抽象成事件對象,并使用一個事件循環(huán)來監(jiān)聽這些事件對象。當(dāng)有事件發(fā)生時,事件循環(huán)會調(diào)用相應(yīng)的回調(diào)函數(shù)來處理這些事件。
(1)事件對象
·event_base_new() //構(gòu)造對象
·event_base_free() //銷毀對象
·event_new() //構(gòu)建事件對象、綁定、事件回調(diào)
·event_free() //銷毀事件對象
·bufferevent_socket_new() //構(gòu)建bufferevent對象
·bufferevent_free() //銷毀bufferevent對象
(2)事件操作
·event_add() //注冊事件
·event_del() //注銷事件
·bufferevent_enable() //注冊事件
·bufferevent_disable() //注銷事件
(3)事件循環(huán)
·event_base_dispatch() //啟動事件循環(huán),libevent會進入一個無限循環(huán)中,不斷監(jiān)聽注冊的I/O事件和定時器事件。當(dāng)有事件發(fā)生時,libevent會調(diào)用相應(yīng)的回調(diào)函數(shù)來處理這些事件。在事件處理完畢后,libevent會繼續(xù)等待下一個事件的發(fā)生。
·event_base_loop() //啟動事件循環(huán),并一直等待事件的發(fā)生
·event_base_loopexit() //通知事件循環(huán)在指定時間后退出
·event_base_break() //通知事件循環(huán)在指定時間后立即退出
(4)事件處理
libevent使用事件驅(qū)動的編程模型來處理事件。在這種模型中,事件循環(huán)會不斷監(jiān)聽注冊的I/O事件和定時器事件。當(dāng)有事件發(fā)生時,libevent會調(diào)用相應(yīng)的回調(diào)函數(shù)來處理這些事件。當(dāng)使用libevent注冊一個事件時,libevent會將這個事件對象添加到事件循環(huán)中。當(dāng)有事件發(fā)生時,libevent會調(diào)用相應(yīng)的回調(diào)函數(shù)來處理這個事件。在回調(diào)函數(shù)中,可以執(zhí)行相應(yīng)的操作,例如讀取數(shù)據(jù)、發(fā)送數(shù)據(jù)、關(guān)閉連接等。
·libevent通信流程:
1. 初始化:首先需要創(chuàng)建一個事件處理器(event_base),并初始化它。在初始化過程中,可以設(shè)置事件處理器的一些參數(shù),比如事件處理模式、超時時間等。
2. 創(chuàng)建事件:在事件處理器中,需要創(chuàng)建需要監(jiān)聽的事件。通過調(diào)用event_new()函數(shù)來創(chuàng)建事件,并設(shè)置事件的回調(diào)函數(shù)和事件類型。
3. 添加事件:創(chuàng)建完事件之后,需要將事件添加到事件處理器中,通過調(diào)用event_add()函數(shù)來添加事件。添加事件之后,事件處理器就可以監(jiān)聽這些事件了。
4. 運行事件循環(huán):在添加完事件之后,需要進入事件循環(huán),等待事件的到來。通過調(diào)用event_base_dispatch()函數(shù)來運行事件循環(huán),當(dāng)有事件到來時,事件處理器會自動調(diào)用相應(yīng)的回調(diào)函數(shù)進行處理。
5. 處理事件:當(dāng)有事件到來時,事件處理器會自動調(diào)用相應(yīng)的回調(diào)函數(shù)進行處理。在回調(diào)函數(shù)中,可以進行相應(yīng)的操作,比如讀寫數(shù)據(jù)、關(guān)閉連接等。
6. 清理資源:當(dāng)程序退出時,需要清理資源。通過調(diào)用event_base_free()函數(shù)來釋放事件處理器占用的資源。
常用指令
指令 | 描述 |
---|---|
nc <host> <port>; | 創(chuàng)建TCP連接 |
nc -u <host> <port> | 創(chuàng)建UDP連接 |
nc -l <port> | 監(jiān)聽端口 |
nc <host> <port> < file | 發(fā)送文件,nc 127.0.0.1 8080 < file.txt |
nc -l <port> > file | 接收文件,nc -l 8080 > file.txt |
nc -zv <host> <start-port>-<end-port> | 端口掃描,nc -zv 127.0.0.1 1-100 |
netstat -tuln | 查看監(jiān)聽的TCP端口 |
ss -tuln | 查看監(jiān)聽的TCP端口 |
sudo iptables -L | 查看IPV4防火墻規(guī)則 |
sudo ip6tables -L | 查看IPV6防火墻規(guī)則 |
問題記錄
問題一:長連接的管理
通常情況下,客戶端和服務(wù)器端會維護一個連接池,用來管理多個長連接。在連接池中,每個連接都可以用一個唯一的標(biāo)識符(例如,連接編號、連接句柄、文件描述符等)來標(biāo)記,但這個標(biāo)識符不是由 TCP 協(xié)議自動分配的,而是由編程語言或操作系統(tǒng)提供的接口來生成。
問題二:連接關(guān)閉問題
1.任務(wù)結(jié)束的條件滿足,其中一方(通常是服務(wù)器端)發(fā)送任務(wù)結(jié)束信號給對方(客戶端)。
2.接收到任務(wù)結(jié)束信號的一方(客戶端)根據(jù)協(xié)議判斷任務(wù)結(jié)束,也可以在任務(wù)結(jié)束后發(fā)送任務(wù)結(jié)束確認(rèn)信號給對方(服務(wù)器端)。
3.雙方都知道任務(wù)結(jié)束后,可以分別在合適的時機主動關(guān)閉連接。
關(guān)閉連接的步驟是,主動關(guān)閉一方發(fā)送一個關(guān)閉連接的請求,等待對方確認(rèn)。對方接收到關(guān)閉請求后,確認(rèn)關(guān)閉并回復(fù)。然后雙方都可以關(guān)閉自己的連接。這樣可以保證雙方都在知情的情況下安全地關(guān)閉連接。需要注意的是,在某些特殊情況下,如果連接的關(guān)閉是由客戶端或服務(wù)器端中的某個程序意外終止或崩潰造成的,可能會導(dǎo)致連接未正確關(guān)閉。在這種情況下,可以使用心跳機制或超時機制來檢測連接的狀態(tài),并在連接空閑一段時間后自動關(guān)閉連接,以防止連接資源泄漏。
問題三:客戶端與服務(wù)器端存在多個TCP連接,數(shù)據(jù)發(fā)送是依次的還是并行的?
在客戶端與服務(wù)器端存在多個TCP連接的情況下,數(shù)據(jù)發(fā)送可以是依次的,也可以是并行的,具體取決于實現(xiàn)的方式和程序設(shè)計。
(1)依次發(fā)送:如果客戶端在處理數(shù)據(jù)發(fā)送時,使用一個連接發(fā)送完一個數(shù)據(jù)后再使用下一個連接發(fā)送下一個數(shù)據(jù),這種情況下數(shù)據(jù)發(fā)送是依次進行的??蛻舳嗽谔幚矶鄠€連接時,每個連接發(fā)送數(shù)據(jù)的過程是按順序進行的,即一個連接發(fā)送完后才會處理下一個連接發(fā)送。
(2)并行發(fā)送:如果客戶端在處理數(shù)據(jù)發(fā)送時,同時利用多個連接進行數(shù)據(jù)發(fā)送,這種情況下數(shù)據(jù)發(fā)送是并行進行的??蛻舳丝梢栽诙鄠€連接上同時發(fā)送數(shù)據(jù),不需要等待一個連接的數(shù)據(jù)發(fā)送完畢再處理下一個連接的數(shù)據(jù)發(fā)送。