libhv接口手册
文章目錄
- libhv接口手冊
- base跨平臺基礎設施
- hatomic.h:原子操作
- hbase.h:基本接口
- hbuf.h:緩存
- hdef.h:常用宏定義
- hdir.h:ls實現
- hendian.h:大小端
- herr.h:錯誤碼
- hexport.h:導出宏
- hfile.h:文件類
- hlog.h:日志
- hmain.h:命令行解析
- hmath.h:數學函數
- hmutex.h:互斥鎖
- hplatform.h:平臺相關宏
- hproc.h:進程
- hscope.h:作用域
- hsocket.h:套接字
- hssl.h:SSL/TLS加密通信
- hstring.h:字符串
- hpath.h: 路徑
- hsysinfo.h:系統信息
- hthread.h:線程
- hthreadpool.h:線程池
- htime.h:時間日期
- hurl.h:URL相關
- hversion.h:版本
- hv.h:總頭文件
- ifconfig.h:ifconfig實現
- event事件循環
- hloop.h:事件循環
- nlog.h:網絡日志
- nmap.h:nmap實現
- evpp (event模塊的cpp封裝類)
- EventLoop.h:事件循環類
- EventLoopThread.h:事件循環線程類
- EventLoopThreadPool.h:事件循環線程池類
- Channel.h:通道類
- TcpClient.h:TCP客戶端類
- TcpServer.h:TCP服務端類
- UdpClient.h:UDP客戶端類
- UdpServer.h:UDP服務端類
- util工具
- base64.h:base64編解碼
- md5.h:MD5數字摘要
- sha1.h:SHA1安全散列算法
- iniparser.h:ini解析
- json.hpp:json解析
- singleton.h:單例模式宏
- http協議
- HttpMessage.h:http消息類
- HttpServer.h:http服務端
- http_client.h:http客戶端
- websocket協議
- WebSocketServer.h: websocket服務端
- WebSocketClient.h: websocket客戶端
- mqtt協議
- mqtt_client.h:mqtt客戶端
- protocol各種常見協議
- icmp.h:ping實現
- dns.h:DNS域名查找
- ftp.h:FTP文件傳輸協議
- smtp.h:SMTP郵件傳輸協議
- last
libhv接口手冊
libhv是一個類似于libevent、libev、libuv的跨平臺網絡庫,提供了更簡單的接口和更豐富的協議。
項目地址:https://github.com/ithewei/libhv.git
碼云鏡像:https://gitee.com/ithewei/libhv.git
QQ技術交流群:739352073
libhv博客專欄:https://hewei.blog.csdn.net/category_9866493.html
libhv源碼剖析:https://hewei.blog.csdn.net/article/details/123295998
base跨平臺基礎設施
base模塊包含了一些c/c++基礎設施,如常用宏定義、日期時間、字符串、文件、目錄、進程、線程、套接字、日志、緩存等;
hatomic.h:原子操作
- 原子標記hatomic_flag_t
- 原子數hatomic_t
測試代碼見:https://github.com/ithewei/libhv/blob/master/unittest/hatomic_test.c
hbase.h:基本接口
- 安全alloc/free
- hv_malloc
- hv_realloc
- hv_calloc
- hv_zalloc
- hv_free
- HV_ALLOC
- HV_ALLOC_SIZEOF
- HV_FREE
- HV_MEMCHECK:程序退出時打印alloc/free計數以判斷程序是否有內存泄露
- 字符串操作
- hv_strupper:字符串轉大寫
- hv_strlower:字符串轉小寫
- hv_strreverse:字符串翻轉
- hv_strstartswith:判斷字符串是否以xxx開頭
- hv_strendswith:判斷字符串是否以xxx結尾
- hv_strcontains:判斷字符串是否包含xxx
- hv_strncpy:安全strncpy
- hv_strncat:安全strncat
- hv_strnchr:字符查找
- hv_strrchr_dot:查找最后一個點(通常用于提取文件后綴)
- hv_strrchr_dir:查找最后的路徑(通常用于分離目錄和文件)
- hv_basename:獲取文件名(利用了上面的strrchr_dir)
- hv_suffixname:獲取文件后綴(利用了上面的strrchr_dot)
- hv_rand:獲取隨機數
- hv_random_string:獲取隨機字符串
- hv_getboolean:1 y on yes true enable返回true(通常用于配置文件)
- 獲取運行時路徑
- get_executable_path:獲取可執行文件絕對路徑,例如/usr/local/bin/httpd
- get_executable_dir:獲取可執行文件所在目錄,例如/usr/local/bin
- get_executable_file:獲取可執行文件名,例如httpd
- get_run_dir:獲取運行目錄,例如/home/www/html
- 文件&目錄
- hv_mkdir_p:遞歸創建目錄
- hv_rmdir_p:遞歸刪除目錄
- hv_exists: 判斷路徑是否存在
- hv_isdir: 判斷是否是目錄
- hv_isfile: 判斷是否是文件
- hv_islink: 判斷是否是鏈接
- hv_filesize: 獲取文件大小
- 解析字符串
- hv_parse_size:解析size字符串
- hv_parse_time:解析時間字符串
- hv_parse_url:解析url字符串
hbuf.h:緩存
- c普通buffer:hbuf_t
- 帶偏移量buffer:offset_buf_t
通常用于消費了一部分數據,需要記錄下當前偏移。如用作socket寫緩存,當一次寫數據包過大時,一次無法發送全部數據,可以記錄下當前發送的偏移量,當socket可寫時再繼續發送剩余的。
- 先進先出buffer:fifo_buf_t
通過記錄頭尾位置,實現先進先出的隊列特性,如用作socket讀緩存,當接受數據還不能組成完整消息時,先緩存數據,追加到尾部,直到達成條件再從頭部開始取出完整一包數據。
- c++普通buffer:HBuf
- 可變長buffer:HVLBuf
HVLBuf可用作可增長數組、雙端隊列
- 環形buffer:HRingBuf
HRingBuf初始化時分配一塊大一點的內存,有序從中申請和釋放,以避免頻繁調用系統malloc/free(影響性能、造成內存碎片)。如用作音視頻緩沖,解碼線程不斷申請內存生產幀數據,渲染線程不斷消費幀數據并釋放內存占用。
hdef.h:常用宏定義
#define ABS(n) ((n) > 0 ? (n) : -(n)) // 絕對值 #define NABS(n) ((n) < 0 ? (n) : -(n)) // 負絕對值#define ARRAY_SIZE(a) (sizeof(a) / sizeof(*(a))) // 數組大小#define BITSET(p, n) (*(p) |= (1u << (n))) // 設置位 #define BITCLR(p, n) (*(p) &= ~(1u << (n))) // 清除位 #define BITGET(i, n) ((i) & (1u << (n))) // 獲取位#define CR '\r' // mac換行符 #define LF '\n' // unix換行符 #define CRLF "\r\n" // dos換行符#define IS_ALPHA(c) (((c) >= 'a' && (c) <= 'z') || ((c) >= 'A' && (c) <= 'Z')) // 是否是字母 #define IS_NUM(c) ((c) >= '0' && (c) <= '9') // 是否是數字 #define IS_ALPHANUM(c) (IS_ALPHA(c) || IS_NUM(c)) // 是否是字母或數字 #define IS_CNTRL(c) ((c) >= 0 && (c) < 0x20) // 是否是控制符 #define IS_GRAPH(c) ((c) >= 0x20 && (c) < 0x7F) // 是否是可打印字符 #define IS_HEX(c) (IS_NUM(c) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F')) // 是否是16進制 #define IS_LOWER(c) (((c) >= 'a' && (c) <= 'z')) // 是否是小寫 #define IS_UPPER(c) (((c) >= 'A' && (c) <= 'Z')) // 是否是大寫#define LOWER(c) ((c) | 0x20) // 字符轉小寫 #define UPPER(c) ((c) & ~0x20) // 字符轉大寫#define MAX(a, b) ((a) > (b) ? (a) : (b)) // 兩者取大 #define MIN(a, b) ((a) < (b) ? (a) : (b)) // 兩者取小#define SAFE_FREE(p) do {if (p) {free(p); (p) = NULL;}} while(0) // 安全free #define SAFE_DELETE(p) do {if (p) {delete (p); (p) = NULL;}} while(0) // 安全delete #define SAFE_DELETE_ARRAY(p) do {if (p) {delete[] (p); (p) = NULL;}} while(0) // 安全delete[]以上列出一些最常用的,更多實用宏定義可自行瀏覽https://github.com/ithewei/libhv/blob/master/base/hdef.h
hdir.h:ls實現
hdir.h中目前只有listdir一個接口,使用簡單。
測試代碼見:
https://github.com/ithewei/libhv/blob/master/unittest/listdir_test.cpp
對跨平臺ls實現感興趣的可以閱讀源碼:
https://github.com/ithewei/libhv/blob/master/base/hdir.cpp
unix平臺使用 opendir -> readdir -> closedir
windows平臺使用FindFirstFile -> FindNextFile -> FindClose
hendian.h:大小端
- 大小端與主機序轉化宏(h代表主機序,be代表大端序,le代表小端序,數字代表多少位整型)
- htobe16
- htobe32
- htobe64
- be16toh
- be32toh
- be64toh
- htole16
- htole32
- htole64
- le16toh
- le32toh
- le64toh
- detect_endian:檢測大小端
- serialize<T>:序列化模板函數,如序列化浮點數serialize<float>
- deserialize<T>:反序列化模板函數,如反序列化浮點數deserialize<float>
herr.h:錯誤碼
herr.h中定義了一些錯誤碼,用到了宏的映射技巧
接口只有一個hv_strerror:根據錯誤碼獲取錯誤字符串
hexport.h:導出宏
- HV_EXPORT:接口導出宏
- HV_DEPRECATED:聲明廢棄宏
- HV_UNUSED:聲明未使用宏
- EXTERN_C、BEGIN_EXTERN_C、END_EXTERN_C:c符號鏈接extern “C”相關宏
- BEGIN_NAMESPACE、END_NAMESPACE、USING_NAMESPACE:c++命名空間相關宏
hfile.h:文件類
提供了簡單好用的HFile類
class HFile { public:HFile() { fp = NULL; }~HFile() { close(); } // 析構時自動關閉文件int open(const char* filepath, const char* mode); // 打開文件(調用fopen)void close(); // 關閉文件(調用fclose)size_t read(void* ptr, size_t len); // 讀文件(調用fread)size_t write(const void* ptr, size_t len) // 寫文件(調用fwrite)size_t size(); // 返回文件大小(調用stat)size_t readall(HBuf& buf); // 讀取文件所有內容到buffersize_t readall(std::string& str); // 讀取文件所有內容到stringbool readline(std::string& str); // 逐行讀取,成功返回true,失敗返回falsepublic:char filepath[MAX_PATH];FILE* fp; };hlog.h:日志
- stdout_logger:標準輸出日志
- stderr_logger:標準錯誤日志
- file_logger:文件日志
- network_logger:網絡日志(定義在https://github.com/ithewei/libhv/blob/master/event/nlog.h)
- logger_create:創建日志器
- logger_destroy:銷毀日志器
- logger_set_handler:設置日志處理函數
- logger_set_level:設置日志等級
- logger_set_level_by_str:設置日志等級by字符串[VERBOSE,DEBUG,INFO,WARN,ERROR,FATAL,SILENT]
- logger_set_max_bufsize:設置日志緩存大小
- logger_enable_color:啟用日志顏色
- logger_print:日志打印
- logger_set_file:設置日志文件
- logger_set_max_filesize:設置日志文件大小
- logger_set_max_filesize_by_str:設置日志文件大小by字符串,如16, 16M, 16MB都表示16M
- logger_set_remain_days:設置日志文件保留天數
- logger_enable_fsync:啟用每次寫日志文件立即刷新到磁盤(即每次都調用fsync,會增加IO耗時,影響性能)
- logger_fsync:刷新緩存到磁盤(如對日志文件實時性有必要的,可使用定時器定時刷新到磁盤)
- logger_get_cur_file:獲取當前日志文件路徑
提供了默認的日志器hlog
// macro hlog* #define hlog hv_default_logger() #define hlog_set_file(filepath) logger_set_file(hlog, filepath) #define hlog_set_level(level) logger_set_level(hlog, level) #define hlog_set_level_by_str(level) logger_set_level_by_str(hlog, level) #define hlog_set_max_filesize(filesize) logger_set_max_filesize(hlog, filesize) #define hlog_set_max_filesize_by_str(filesize) logger_set_max_filesize_by_str(hlog, filesize) #define hlog_set_remain_days(days) logger_set_remain_days(hlog, days) #define hlog_enable_fsync() logger_enable_fsync(hlog, 1) #define hlog_disable_fsync() logger_enable_fsync(hlog, 0) #define hlog_fsync() logger_fsync(hlog) #define hlog_get_cur_file() logger_get_cur_file(hlog)提供了便利的日志宏hlogd, hlogi, hlogw, hloge, hlogf
提供了更大眾化的別名LOGD, LOGI, LOGW, LOGE, LOGF
hlog跨平臺、零依賴、多線程安全、使用簡單、配置靈活、即使你不使用libhv,也可以直接將hlog.h、hlog.c直接拷貝到你的項目中使用。
hmain.h:命令行解析
- main_ctx_init:main上下文初始化
- parse_opt:解析命令行(類似于getopt)
- parse_opt_long:解析命令行(類似于getopt_long)
- get_arg:獲取命令行參數值
- get_env:獲取環境變量
- signal_init:信號初始化(內部初始化了SIGINT、SIGCHLD子進程崩潰重啟、和自定義的SIGNAL_TERMINATE退出所以進程、SIGNAL_RELOAD重新加載配置文件)
- signal_handle:信號處理signal=[start,stop,restart,status,reload]
- create_pidfile:創建pid文件
- delete_pidfile:刪除pid文件
- getpid_from_pidfile:從pid文件中獲取pid
- setproctitle:設置進程標題(只在unix下生效)
- master_workers_run:master-workers模型,即多進程/多線程模型(參考了nginx)
hmain.h中提供一系列main入口有用的工具,如命令行解析、信號處理、創建pid文件、以及強大的master-workers模型。
測試代碼見:https://github.com/ithewei/libhv/blob/master/examples/hmain_test.cpp
測試步驟:
毫不夸張的說,搞懂了hmain_test.cpp,再也不用愁寫不出規范的命令行程序了。
hmath.h:數學函數
- floor2e:2的指數倍向下取整,如floor2e(5) = 4
- ceil2e:2的指數倍向上取整,如ceil2e(5) = 8
- varint_encode: 可變長整型編碼
- varint_decode: 可變長整型解碼
hmutex.h:互斥鎖
互斥鎖
- hmutex_init
- hmutex_destroy
- hmutex_lock
- hmutex_unlock
自旋鎖
- hspinlock_init
- hspinlock_destroy
- hspinlock_lock
- hspinlock_unlock
讀寫鎖
- hrwlock_init
- hrwlock_destroy
- hrwlock_rdlock
- hrwlock_rdunlock
- hrwlock_wrlock
- hrwlock_wrunlock
定時鎖
- htimed_mutex_init
- htimed_mutex_destroy
- htimed_mutex_lock
- htimed_mutex_unlock
- htimed_mutex_lock_for
條件變量
- hcondvar_init
- hcondvar_destroy
- hcondvar_wait
- hcondvar_wait_for
- hcondvar_signal
- hcondvar_broadcast
信號量
- hsem_init
- hsem_destroy
- hsem_wait
- hsem_post
- hsem_wait_for
只執行一次
- honce
c++類封裝
- MutexLock:互斥鎖
- SpinLock:自旋鎖
- RWLock:讀寫鎖
- LockGuard:守護鎖(構造時即lock,析構時即unlock,類似于std::lock_guard)
hthread.h跨平臺,基于Windows API和pthread兩套實現,命名類似pthread,無記憶負擔,是不是很便利呢,媽媽再也不用擔心沒有c++,寫不出跨平臺的多線程同步代碼了。
鄙人強烈推薦讀下hthread.h源碼,對應付面試中各種同步鎖大有好處、加深理解。
測試代碼見:https://github.com/ithewei/libhv/blob/master/unittest/hmutex_test.c
此處附上一個彩蛋:java synchronized 一行宏實現
#define synchronized(lock) for (std::lock_guard<std::mutex> _lock_(lock), *p = &_lock_; p != NULL; p = NULL)測試代碼見:https://github.com/ithewei/libhv/blob/master/unittest/synchronized_test.cpp
hplatform.h:平臺相關宏
- 操作系統宏:OS_WIN、OS_UNIX、OS_LINUX、OS_ANDROID、OS_DARWIN、OS_FREEBSD、OS_OPENBSD、OS_SOLARIS
- 體系結構宏:ARCH_X86、ARCH_X86_64、ARCH_ARM、ARCH_ARM64
- 編譯器宏:COMPILER_MSVC、COMPILER_MINGW、COMPILER_GCC、COMPILER_CLANG
- 字節序宏:BYTE_ORDER、BIG_ENDIAN、LITTLE_ENDIAN
hplatform.h和hconfig.h(./configure腳本生成的配置文件)是libhv跨平臺的基石。
hproc.h:進程
- hproc_spawn:unix下使用多進程,windows使用多線程
hscope.h:作用域
- ScopeCleanup:作用域清理函數
- ScopeFree:作用域free
- ScopeDelete:作用域delete
- ScopeDeleteArray:作用域delete[]
- ScopeRelease:作用域release
- ScopeLock:作用域鎖
hscope.h利用RAII機制,定義了一系列作用域模版類,方便做資源釋放。
此處附上一個彩蛋:golang defer 宏實現
class Defer { public:Defer(Function&& fn) : _fn(std::move(fn)) {}~Defer() { if(_fn) _fn();} private:Function _fn; }; #define defer(code) Defer STRINGCAT(_defer_, __LINE__)([&](){code});defer測試代碼見:https://github.com/ithewei/libhv/blob/master/unittest/defer_test.cpp
hsocket.h:套接字
- socket_errno:socket錯誤碼
- socket_strerror:根據socket錯誤碼獲取錯誤字符串
- blocking:設置socket為阻塞
- nonblocking:設置socket為非阻塞
sockaddr_u:包裹了IPv4、IPv6、Unix Domian Socket
typedef union {struct sockaddr sa;struct sockaddr_in sin; // IPv4struct sockaddr_in6 sin6; // IPv6struct sockaddr_un sun; // Unix Domain Socket } sockaddr_u;下面是一些sockaddr_u的輔助函數:
- ResolveAddr:域名解析成sockaddr_u
- sockaddr_ip:從sockaddr_u中獲取ip地址
- sockaddr_port:從sockaddr_u中獲取端口
- sockaddr_set_ip:sockaddr_u設置ip地址
- sockaddr_set_port:sockaddr_u設置端口
- sockaddr_set_ipport:sockaddr_u設置ip地址和端口
- sockaddr_set_path:sockaddr_u設置路徑
- sockaddr_len:sockaddr_u根據sa_family,獲取結構體長度
- sockaddr_str:sockaddr_u轉化成可讀字符串
- sockaddr_print:sockaddr_u打印可讀字符串
socket、bind、listen、connect封裝
- Bind:封裝了socket -> setsockopt -> bind流程
- Listen:封裝了Bind -> listen流程
- Connect:封裝了Resolver -> socket -> nonblocking -> connect流程
- ConnectNonblock:非阻塞connect,調用了Connect(host, port, 1)
- ConnectTimeout:超時connect,封裝了Connect(host, port, 1) -> select -> blocking
Unix Domain Socket(以路徑取代端口號)
- BindUnix
- ListenUnix
- ConnectUnix
- ConnectUnixNonblock
- ConnectUnixTimeout
setsockopt
- tcp_nodelay:禁用Nagle算法,降低小包的響應延時
- tcp_nopush:當包累計到一定大小后再發送,通常與sendfile配合使用,提高大數據的通信性能
- tcp_keepalive:設置TCP保活
- udp_broadcast:設置UDP廣播
- so_sndtimeo:設置發送超時
- so_rcvtimeo:設置接收超時
hsocket.h、hsocket.c展示了跨平臺socket編程的寫法,適配了IPv4、IPv6、Unix Domain Socket,可以說是UNP(Unix Network Programming:UNIX網絡編程)的實踐,推薦網絡編程初學者閱讀源碼。
hssl.h:SSL/TLS加密通信
- hssl_ctx_init:SSL_CTX初始化
- hssl_ctx_cleanup:SSL_CTX清理
- hssl_ctx_instance:返回SSL_CTX實例
- hssl_ctx_new:SSL_CTX創建
- hssl_ctx_free:SSL_CTX釋放
- hssl_new:SSL創建
- hssl_free:SSL釋放
- hssl_accept
- hssl_connect
- hssl_read
- hssl_write
- hssl_close
- hssl_set_sni_hostname:設置SNI域名
hssl.h封裝了SSL/TLS操作,目前有openssl、gnutls、mbedtls、appletls等實現,編譯時可選擇打開WITH_OPENSSL、WITH_GNUTLS、WITH_MBEDTLS選項。
hstring.h:字符串
- hv::to_string:T轉字符串模板函數
- hv::from_string:字符串轉T模板函數
- asprintf:格式化輸出字符串,如asprintf("%d+%d=%d", 1, 2, 3)返回字符串“1+2=3”
- split:分割字符串成字符列表,如split("1, 2, 3"),返回字符串列表["1", "2", "3"]
- splitKV:分割KV字符串,如splitKV("user=admin&pswd=123456")返回map{"user": "admin", "pswd": "123456"}
- trim:修剪字符串
- trimL:修剪字符串左邊
- trimR:修剪字符串右邊
- trim_pairs:指定pairs,修剪字符串
- replace:替換字符串
hpath.h: 路徑
- exists: 判斷路徑是否存在
- isdir: 判斷是否是目錄
- isfile: 判斷是否是文件
- islink: 判斷是否是鏈接
- basename:獲取基本路徑,類似shell命令basename
- dirname:獲取目錄名,類似shell命令dirname
- filename:獲取文件名
- suffixname:獲取后綴名
- join: 路徑拼接
例如:
std::string filepath = "/mnt/share/image/test.jpg"; basename(filepath) = "test.jpg" dirname(filepath) = "/mnt/share/image" filename(filepath) = "test" suffixname(filepath) = "jpg"測試代碼見:https://github.com/ithewei/libhv/blob/master/unittest/hstring_test.cpp
hsysinfo.h:系統信息
- get_ncpu:獲取CPU邏輯核數
- get_meminfo:獲取內存信息
hthread.h:線程
- hv_getpid:獲取進程id
- hv_gettid:獲取線程id
- hthread_create:創建線程
- hthread_join:加入線程(等待線程退出)
c++提供了一個HThread線程封裝類
class HThread { public:virtual int start(); // 開始virtual int stop(); // 結束virtual int pause(); // 暫停virtual int resume(); // 繼續virtual void run(); // 可重載run自定義線程過程virtual void doTask(); // 可重載doTask實現線程循環中的任務函數 };hthread.h封裝了跨平臺的線程操作,在不使用c++ std::thread的情況下也能寫出跨平臺的創建線程程序了。
hthreadpool.h:線程池
class HThreadPool { public:HThreadPool(int size = std::thread::hardware_concurrency()); // size為線程池中線程數量int start(); // 開始int stop(); // 停止int pause(); // 暫停int resume(); // 繼續int wait(); // 等待所有任務做完// commit:提交任務// return a future, calling future.get() will wait task done and return RetType.// commit(fn, args...)// commit(std::bind(&Class::mem_fn, &obj))// commit(std::mem_fn(&Class::mem_fn, &obj))template<class Fn, class... Args>auto commit(Fn&& fn, Args&&... args) -> std::future<decltype(fn(args...))> };測試代碼見:https://github.com/ithewei/libhv/blob/master/unittest/threadpool_test.cpp
htime.h:時間日期
htime.h、htime.c封裝了跨平臺的日期時間方法,接口如下:
- gettick_ms:返回tick毫秒數
- gettimeofday_ms:返回gettimeofday毫秒數
- gethrtime_us:返回高精度微秒數
- datetime_now:返回日期時間
- datetime_mktime:根據datetime_t返回時間戳
- datetime_past:返回過去幾天前的datetime_t
- datetime_future:返回未來幾天后的datetime_t
- duration_fmt:時長格式化成字符串
- datetime_fmt:datetime_t格式化成字符串
- gmtime_fmt:GMT時間格式化成字符串
- days_of_month:返回某月有多少天
- month_atoi:月份字符串轉整數months=["January", "February", "March", "April", "May", "June","July", "August", "September", "October", "November", "December"]
- month_itoa:月份整數轉字符串
- weekday_atoi:星期字符串轉整數weekdays=["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
- weekday_itoa:星期整數轉字符串
- hv_compile_datetime:返回libhv庫的編譯日期時間
- cron_next_timeout:計算cron下一次觸發時間
測試代碼見:https://github.com/ithewei/libhv/blob/master/unittest/date_test.c
hurl.h:URL相關
- url_escape:URL轉義(將URL中有歧義字符如/,轉化成%02X16進制格式)
- url_unescape:URL反轉義
hversion.h:版本
- hv_version:返回libhv靜態版本
- hv_compile_version:返回libhv編譯版本
- version_atoi:版本字符串轉整型(如1.2.3.4 => 0x01020304)
- version_itoa:版本整型轉字符串(如0x01020304 => 1.2.3.4)
hv.h:總頭文件
base下的頭文件比較分散,所以提供了一個hv.h的總頭文件
ifconfig.h:ifconfig實現
- ifconfig:獲取網絡接口信息,類似shell下ifconfig命令
測試代碼見:https://github.com/ithewei/libhv/blob/master/unittest/ifconfig_test.cpp
event事件循環
event模塊是libhv的事件循環模塊,實現了類似libevent、libev、libuv非阻塞IO、定時器等功能。
如果說base模塊是libhv的基石,event模塊就是libhv的靈魂,上層的應用層協議(如http、websocket、mqtt、redis)都將基于event模塊實現。
hloop.h:事件循環
- hloop_new:創建事件循環實例
- hloop_free:釋放事件循環實例
- hloop_run:運行事件循環
- hloop_stop:停止事件循環
- hloop_pause:暫停事件循環
- hloop_resume:繼續事件循環
- hloop_update_time:更新事件循環時間
- hloop_now:返回事件循環里的當前時間(單位s)
- hloop_now_ms:返回事件循環里的當前時間(單位ms)
- hloop_now_us:返回事件循環里的當前時間(單位us)
用戶數據 - hloop_set_userdata:設置用戶數據
- hloop_userdata:返回用戶數據
自定義事件 - hloop_post_event:向事件循環投遞自定義事件(此接口線程安全)
事件基類
hio_t、htimer_t、hidle_t皆是hevent_t的子類,繼承hevent_t數據成員以及函數成員 - hevent_set_priority:設置事件優先級
- hevent_set_userdata:設置事件用戶數據
- hevent_loop:返回當前loop
- hevent_type:返回事件類型
- hevent_id:返回事件id
- hevent_priority:返回事件優先級
- hevent_userdata:返回事件用戶數據
idle空閑事件 - hidle_add:添加空閑事件回調
- hidle_del:刪除空閑事件
timer定時器事件 - htimer_add:添加定時器
- htimer_add_period:添加period型定時器(類似于cron)
- htimer_del:刪除定時器
- htimer_reset:重置定時器
IO事件
low-level apis - hio_engine:返回底層IO多路復用引擎(select/poll/epoll/kqueue/iocp/evport)
- hio_get:根據sockfd返回一個hio_t實例指針
- hio_add:添加IO讀寫事件
- hio_del:刪除IO讀寫事件
- hio_fd:返回文件描述符
- hio_error:返回錯誤碼
- hio_type:返回IO類型(STDIO/FILE/TCP/UDP/SSL等)
- hio_localaddr:返回本端地址
- hio_peeraddr:返回對端地址
- hio_setcb_accept:設置accept回調
- hio_setcb_connect:設置connect回調
- hio_setcb_read:設置read回調
- hio_setcb_write:設置write回調
- hio_setcb_close:設置close回調
- hio_enable_ssl:啟用SSL/TLS
- hio_set_readbuf:設置讀緩存buffer(每一個事件循環占用一個線程,所以事件循環中有一個默認的讀緩存,但是你可以通過此接口傳入自己的buffer,避免后續再memcpy拷貝)
- hio_set_connect_timeout:設置連接超時
- hio_set_close_timeout:設置關閉超時(這里解釋下為何非阻塞IO有關閉超時一說,因為可能存在寫隊列未發送完成的情況,所以需要延遲關閉套接字)
- hio_set_read_timeout:設置讀超時,一段時間沒有數據接收,自動斷開連接
- hio_set_write_timeout:設置寫超時,一段時間沒有數據發送,自動斷開連接
- hio_set_keepalive_timeout:設置keepalive超時(一段時間無數據收發斷開連接,http模塊即用到了此接口,使用nc 127.0.0.1 8080連接后不發數據,75s后連接將被libhv httpd服務端強制斷開)
- hio_set_heartbeat:設置應用層心跳
- hio_set_unpack:設置拆包規則,支持固定包長、分隔符、頭部長度字段三種常見的拆包方式,內部根據拆包規則處理粘包與分包,保證回調上來的是完整的一包數據,大大節省了上層處理粘包與分包的成本
- hio_read_until_length:讀取數據直到指定長度才回調上來
- hio_read_until_delim:讀取數據直到遇到分割符才回調上來
- hio_setup_upstream:設置轉發
- hio_accept
- hio_connect
- hio_read
- hio_write
- hio_close
high-level apis
- hread
- hwrite
- hclose
tcp - haccept
- hconnect
- hrecv
- hsend
udp - hio_set_type
- hio_set_localaddr
- hio_set_peeraddr
- hrecvfrom
- hsendto
top-level apis
- hloop_create_tcp_server:在事件循環中創建TCP服務端
- hloop_create_tcp_client:在事件循環中創建TCP客戶端
- hloop_create_ssl_server:在事件循環中創建SSL服務端
- hloop_create_ssl_client:在事件循環中創建SSL客戶端
- hloop_create_udp_server:在事件循環中創建UDP服務端
- hloop_create_udp_client:在事件循環中創建UDP客戶端
hloop.h是事件循環對外頭文件,如想使用libhv開發TCP/UDP自定義協議網絡通信程序,建議通讀此頭文件。
event模塊封裝了多種IO多路復用機制,感興趣的可以閱讀源碼,你將對reactor模式、select/poll/epoll有更深的理解。
- linux下默認使用epoll
- windows下使用poll(IOCP尚不完善)
- mac下使用kqueue
- solaris下使用port
測試代碼見:
- 定時器測試 https://github.com/ithewei/libhv/blob/master/examples/htimer_test.c
- TCP服務端 https://github.com/ithewei/libhv/blob/master/examples/tcp_echo_server.c
- UDP服務端 https://github.com/ithewei/libhv/blob/master/examples/udp_echo_server.c
- TCP/UDP客戶端 https://github.com/ithewei/libhv/blob/master/examples/nc.c
測試步驟:
examples下展示了用libhv實現echo、chat、proxy三種經典服務的寫法,使用前event模塊的必讀。
nlog.h:網絡日志
- network_logger:網絡日志處理器
- nlog_listen:網絡日志監聽服務
測試代碼見:https://github.com/ithewei/libhv/blob/master/examples/hloop_test.c
測試步驟:
nmap.h:nmap實現
- nmap_discover:nmap實現
- segment_discover:網段發現
- host_discover:主機發現
測試代碼見:https://github.com/ithewei/libhv/blob/master/examples/nmap
測試步驟:
evpp (event模塊的cpp封裝類)
EventLoop.h:事件循環類
- class EventLoop
EventLoopThread.h:事件循環線程類
- class EventLoopThread
EventLoopThreadPool.h:事件循環線程池類
- class EventLoopThreadPool
Channel.h:通道類
- class Channel
TcpClient.h:TCP客戶端類
- class TcpClient
TcpServer.h:TCP服務端類
- class TcpServer
UdpClient.h:UDP客戶端類
- class UdpClient
UdpServer.h:UDP服務端類
- class UdpServer
util工具
base64.h:base64編解碼
- hv_base64_encode:base64編碼
- hv_base64_decode:base64解碼
md5.h:MD5數字摘要
- HV_MD5Init:MD5初始化
- HV_MD5Update:MD5更新
- HV_MD5Final:MD5結束
sha1.h:SHA1安全散列算法
- HV_SHA1Init:SHA1初始化
- HV_SHA1Update: SHA1更新
- HV_SHA1Final:SHA1結束
iniparser.h:ini解析
class HV_EXPORT IniParser { public:int LoadFromFile(const char* filepath); // 從文件加載int LoadFromMem(const char* data); // 從內存加載int Unload(); // 卸載int Reload(); // 重新加載string DumpString(); // 轉存為字符串int Save(); // 保存int SaveAs(const char* filepath); // 保存為string GetValue(const string& key, const string& section = ""); // 獲取值void SetValue(const string& key, const string& value, const string& section = ""); // 設置值// T = [bool, int, float]template<typename T>T Get(const string& key, const string& section = "", T defvalue = 0); // 獲取值模板函數// T = [bool, int, float]template<typename T>void Set(const string& key, const T& value, const string& section = ""); // 設置值模板函數 };json.hpp:json解析
nlohmann::json是一個modern c++ json解析庫,具體使用參考https://github.com/nlohmann/json
(注:windows下該頭文件需在VS2015以上版本才能順利編譯通過)
singleton.h:單例模式宏
- DISABLE_COPY:禁止拷貝宏
- SINGLETON_DECL:單例模式聲明宏
- SINGLETON_IMPL:單例模式實現宏
http協議
http模塊的使用可參考這篇博客c++編寫HTTP API服務端/客戶端最簡單的庫,沒有之一
http模塊是event模塊目前僅有的得意門生,服務端接口參考了golang gin,客戶端接口參考了python requests,使用c++開發,至于為何使用c++,如果你用過libevent的evhttp,就知道c寫上層邏輯是有多痛苦。
我也不推薦使用libhv開發CRUD業務服務,使用golang、python、ruby它不香嗎?c++開發http服務的場景可能就是需要將C接口的算法SDK以http api的方式提供出去。
HttpMessage.h:http消息類
- HttpMessage:http消息基類
- HttpRequest:http請求類
- HttpResponse:http響應類
HttpMessage.h建議通讀,才能更好的使用好libhv的http相關功能。
HttpServer.h:http服務端
- http_server_run
- http_server_stop
- class HttpServer
測試代碼見:https://github.com/ithewei/libhv/tree/master/examples/httpd
測試步驟:
http_client.h:http客戶端
- http_client_send:同步客戶端
- http_client_send_async:異步客戶端
- class HttpClient
測試代碼見:https://github.com/ithewei/libhv/blob/master/examples/curl.cpp
測試步驟:
另外有python requests風格requests.h、javascript axios風格axios.h的封裝。
websocket協議
WebSocketServer.h: websocket服務端
- websocket_server_run
- websocket_server_stop
- class WebSocketServer
測試代碼見:https://github.com/ithewei/libhv/tree/master/examples/websocket_server_test.cpp
WebSocketClient.h: websocket客戶端
- class WebSocketClient
測試代碼見:https://github.com/ithewei/libhv/tree/master/examples/websocket_client_test.cpp
mqtt協議
mqtt_client.h:mqtt客戶端
- mqtt_client_new:新建MQTT客戶端結構體
- mqtt_client_free:釋放MQTT客戶端結構體
- mqtt_client_run:運行MQTT客戶端
- mqtt_client_stop:停止MQTT客戶端
- mqtt_client_set_id:設置客戶端ID
- mqtt_client_set_will:設置遺囑
- mqtt_client_set_auth:設置認證用戶名密碼
- mqtt_client_set_callback:設置回調
- mqtt_client_set_userdata:設置用戶數據
- mqtt_client_get_userdata:獲取用戶數據
- mqtt_client_get_last_error:獲取最后的錯誤碼
- mqtt_client_set_ssl_ctx:設置SSL_CTX(用于SSL/TLS加密通信)
- mqtt_client_new_ssl_ctx:新建SSL_CTX
- mqtt_client_set_reconnect:設置重連
- mqtt_client_reconnect:重連
- mqtt_client_connect:開始連接
- mqtt_client_disconnect:斷開連接
- mqtt_client_publish:發布
- mqtt_client_subscribe:訂閱
- mqtt_client_unsubscribe:取消訂閱
測試代碼見:https://github.com/ithewei/libhv/tree/master/examples/mqtt
protocol各種常見協議
protocol模塊展示了各種常見協議的實現,可供學習參考。
icmp.h:ping實現
- ping:ping實現
測試代碼見:https://github.com/ithewei/libhv/blob/master/unittest/ping_test.c
測試步驟:
dns.h:DNS域名查找
- nslookup:dns查找
測試代碼見:https://github.com/ithewei/libhv/blob/master/unittest/nslookup_test.c
測試步驟:
ftp.h:FTP文件傳輸協議
- ftp_connect:連接
- ftp_login:登錄
- ftp_quit:退出
- ftp_exec:執行命令
- ftp_upload:上傳文件
- ftp_download:下載文件
測試代碼見:https://github.com/ithewei/libhv/blob/master/unittest/ftp_test.c
smtp.h:SMTP郵件傳輸協議
- sendmail:發送郵件
測試代碼見:https://github.com/ithewei/libhv/blob/master/unittest/sendmail_test.c
last
個人開發維護實屬不易,如果覺得不錯,請github上star下,若libhv能帶給你一點啟發,吾將甚感欣慰!
總結
- 上一篇: 计算机科学与技术专业实训手册,计算机专业
- 下一篇: java调用指定浏览器_Java调用浏览