日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

libhv接口手册

發布時間:2023/12/9 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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_flag_t flag = HATOMIC_FLAG_INIT; hatomic_flag_test_and_set(&flag); // 原子測試并置位
  • 原子數hatomic_t
hatomic_t cnt = HATOMIC_VAR_INIT(0); hatomic_inc(&cnt); // 原子自增 hatomic_dec(&cnt); // 原子自減 hatomic_add(&cnt, 3); // 原子加 hatomic_sub(&cnt, 3); // 原子減

測試代碼見: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
typedef struct hbuf_s {char* base; // 指針起始地址size_t len; // buffer長度 } hbuf_t;
  • 帶偏移量buffer:offset_buf_t
typedef struct offset_buf_s {char* base; // 指針起始地址size_t len; // buffer長度size_t offset; // 偏移量 } offset_buf_t;

通常用于消費了一部分數據,需要記錄下當前偏移。如用作socket寫緩存,當一次寫數據包過大時,一次無法發送全部數據,可以記錄下當前發送的偏移量,當socket可寫時再繼續發送剩余的。

  • 先進先出buffer:fifo_buf_t
typedef struct fifo_buf_s {char* base; // 指針起始地址size_t len; // buffer長度size_t head; // 頭部位置size_t tail; // 尾部位置 } fifo_buf_t;

通過記錄頭尾位置,實現先進先出的隊列特性,如用作socket讀緩存,當接受數據還不能組成完整消息時,先緩存數據,追加到尾部,直到達成條件再從頭部開始取出完整一包數據。

  • c++普通buffer:HBuf
class HBuf : public hbuf_t { // 繼承自c普通buffer public:HBuf();HBuf(void* data, size_t len);HBuf(size_t cap) { resize(cap); }virtual ~HBuf() { cleanup(); } // 析構時會自動是否內存void* data() { return base; }size_t size() { return len; }bool isNull() { return base == NULL || len == 0; }void cleanup(); // free內存void resize(size_t cap); // realloc// 深拷貝(resize后memcpy)void copy(void* data, size_t len);void copy(hbuf_t* buf); };
  • 可變長buffer:HVLBuf
class HVLBuf : public HBuf { // VL: Variable-Length可變長 public:HVLBuf();HVLBuf(void* data, size_t len);HVLBuf(size_t cap);virtual ~HVLBuf() {}char* data() { return base + _offset; } // 返回當前偏移地址size_t size() { return _size; } // 返回實際已存儲數據量void push_front(void* ptr, size_t len);void push_back(void* ptr, size_t len);void pop_front(void* ptr, size_t len);void pop_back(void* ptr, size_t len);void clear();void prepend(void* ptr, size_t len); // alias push_frontvoid append(void* ptr, size_t len); // alias push_backvoid insert(void* ptr, size_t len); // alias push_backvoid remove(size_t len); // alias pop_frontprivate:size_t _offset; // 用于記錄當前偏移量size_t _size; // 用于記錄實際存儲數據量 };

HVLBuf可用作可增長數組、雙端隊列

  • 環形buffer:HRingBuf
class HRingBuf : public HBuf { public:HRingBuf();HRingBuf(size_t cap);virtual ~HRingBuf();char* alloc(size_t len);void free(size_t len);void clear();size_t size();private:size_t _head;size_t _tail;size_t _size; };

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
測試步驟:

make hmain_test # 編譯hmain_test bin/hmain_test -h # -h打印幫助信息 bin/hmain_test -v # -v打印版本信息 bin/hmain_test -c etc/hmain_test.conf -t # -c設置配置文件 -t測試加載配置文件 bin/hmain_test -d # -d后臺運行 cat logs/hmain_test.pid # 可以看到創建的pid文件 ps aux | grep hmain_test # 可以看到master-workers模型效果 bin/hmain_test -s status # -s表示信號處理,status表示查看進程狀態 bin/hmain_test -s stop # stop表示停止進程 bin/hmain_test -s start # start表示啟動進程 bin/hmain_test -s restart -d # restart表示重啟進程 bin/hmain_test -s reload # reload表示重新加載配置文件(比如修改日志等級為DEBUG,不用重啟進程就能打印DEBUG日志了)

毫不夸張的說,搞懂了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模塊的必讀。

make examples# 回顯 bin/tcp_echo_server 1234 bin/nc 127.0.0.1 1234# 群聊 bin/tcp_chat_server 1234 bin/nc 127.0.0.1 1234 bin/nc 127.0.0.1 1234# 代理 bin/httpd -s restart -d bin/tcp_proxy_server 1234 127.0.0.1:8080 bin/curl -v 127.0.0.1:8080 bin/curl -v 127.0.0.1:1234bin/udp_echo_server 1234 bin/nc -u 127.0.0.1 1234

nlog.h:網絡日志

  • network_logger:網絡日志處理器
  • nlog_listen:網絡日志監聽服務
    測試代碼見:https://github.com/ithewei/libhv/blob/master/examples/hloop_test.c
    測試步驟:
make examples bin/hloop_test telnet 127.0.0.1 10514

nmap.h:nmap實現

  • nmap_discover:nmap實現
  • segment_discover:網段發現
  • host_discover:主機發現
    測試代碼見:https://github.com/ithewei/libhv/blob/master/examples/nmap
    測試步驟:
make nmap sudo bin/nmap <ip>

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
測試步驟:

./getting_started.sh

http_client.h:http客戶端

  • http_client_send:同步客戶端
  • http_client_send_async:異步客戶端
  • class HttpClient

測試代碼見:https://github.com/ithewei/libhv/blob/master/examples/curl.cpp
測試步驟:

make curl bin/curl -v www.example.com

另外有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
測試步驟:

make unittest sudo bin/ping www.baidu.com

dns.h:DNS域名查找

  • nslookup:dns查找

測試代碼見:https://github.com/ithewei/libhv/blob/master/unittest/nslookup_test.c
測試步驟:

make unittest bin/nslookup www.baidu.com

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能帶給你一點啟發,吾將甚感欣慰!

總結

以上是生活随笔為你收集整理的libhv接口手册的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。