C++开源库使用之evpp(一)

xiaoxiao2021-04-18  75

                                          配置安装与使用范例

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架构的开源库。

安装之后,执行如下命令:vcpkg.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/evpphttps://blog.csdn.net/cjmqas/article/details/79282847 https://github.com/Microsoft/vcpkg

 

 

 

 

 

 

 

 

转载请注明原文地址: https://www.6miu.com/read-4820151.html

最新回复(0)