C++開源庫使用之evpp(一)
配置安裝與使用範例
1.1簡介
evpp是一個基於libevent開發的現代化C++11高效能網路伺服器,自帶TCP/UDP/HTTP等協議的非同步非阻塞式的伺服器和客戶端庫。( 由國內360公司開發並提供的C++開源庫)釋出在GitHub上:https://github.com/Qihoo360/evpp
1.2配置安裝
由於本人工作環境為Windows系統上的VS2015,遂在此著重說明一下Windows平臺上如何快速的配置安裝evpp開源庫。Linux系統上的配置在此略過。(Linux上配置安裝請參考:https://github.com/Qihoo360/evpp/blob/master/docs/quick_start.md)
使用的工具:vcpkg (https://github.com/Microsoft/vcpkg)
該工具的優點:
自動下載開源庫原始碼;原始碼包的快取管理和版本管理,可以升級版本;輕鬆編譯;依賴關係檢查(比如編譯libcurl,會自動下載zlib、openssl進行編譯);無縫整合Visual Studio,不需要設定庫檔案、標頭檔案的所在目錄,自動整合;Visual Studio全平臺支援,不僅支援Debug/Release、x86/x64編譯,還支援UWP、ARM平臺的編譯。
注意——該工具僅支援VS2015 update3版本和VS2017所有版本。
關於vcpkg的編譯和操作指令請參考:https://blog.csdn.net/cjmqas/article/details/79282847
在編譯vcpkg之後,接下來開始安裝evpp。
㈠進入到vcpkg.exe所在資料夾
以管理員的方式執行命令提示符——開啟提示符視窗——輸入安裝vcpkg的碟符——cd切換到具體的資料夾
注:具體的資料夾視個人安裝編譯情況而定,上圖僅供參考。
㈡安裝evpp
執行命令如下命令:vcpkg.exe install evpp:x64-windows
注:如何命令列中不指定特定架構的話,將預設安裝x86架構的開源庫。
安裝之後,執行如下命令:vcplg.exe integrate install,即將其整合到全域性。
㈢VS2015上使用
在整合到全域性之後,可以在任意工程中使用安裝好了的evpp庫。
注意:由於我們安裝時選擇的是x64架構的evpp庫,因此在使用時需要將VS2015的開發環境切換到x64的情形下才能正常的使用。(VS新建工程一般預設x86)
1.3使用範例
Ⅰ客戶端程式示例
包含標頭檔案
#include "Cat021DLL.h" //該標頭檔案為個人從外部匯入的標頭檔案
#include <iostream>
#include <string>
#include <evpp/tcp_client.h> //evpp庫包含的標頭檔案
#include <evpp/buffer.h>
#include <evpp/tcp_conn.h>
主程式
重點函式講解①:訊息回撥函式——void evpp::TCPClient::SetMessageCallback(const evpp::MessageCallback& cb)
注:設定訊息回撥以處理來自遠端伺服器的訊息(資訊)
重點函式講解②:連接回調函式——void::evpp::TCPClient::SetConnectionCallback(const evpp::ConnectionCallback& cb)
注:當TCPClient和遠端伺服器建立一個連線或者一個存在的連線斷開或者建立連線失敗時設定相關的連線事件。
示例主程式如下:
int main()
{
std::string addr="192.168.8.131:8078";
evpp::EventLoop loop;
evpp::TCPClient client(&loop,addr,"TCPClient"); //建構函式,創造客戶端物件
//訊息回撥函式
client.SetMessageCallback([&loop,&client](const evpp::TCPConnPtr& conn,evpp::Buffer* msg) {
evpp::Slice sli=msg->ToSlice();
unsigned char ch[200];
for(auto i=0;i<sli.size();++i)
{
ch[i]=sli[i];
}
std::string s=DataParser(ch);
std::cout<<s<<std::endl;
msg->Reset(); //清空緩衝區
}); //引數由匿名函式物件組成
//連接回調函式
client.SetConnectionCallback([](const evpp::TCPConnPtr& conn) {
if(conn->IsConnected()) {
LOG_INFO<<"Connected to"<<conn->remote_addr();
conn->Send("hello");
}
else {
conn->loop()->Stop();
}
});
client.Connect();
loop.Run();
return 0;
}
#include "winmain-inl.h"
//關於此處為何這樣使用,檢視其標頭檔案原始碼即可瞭解。其大致意思
//是在程式啟動時初始化Winsock 2.2;結束時呼叫WSACleanup()函式中止Winsock 2 DLL的使用。
//關於這種方式呼叫標頭檔案,個人感覺這樣書寫程式看起來較為簡潔,但缺乏一致性。
1.4參考資料
- https://github.com/Qihoo360/evpp
- https://blog.csdn.net/cjmqas/article/details/79282847
- https://github.com/Microsoft/vcpkg