#libhv是一个相当不错的库,学习过程中,有些东西需要记录一下。
一、libhv库下载,编译
【1】项目地址:https://github.com/ithewei/libhv.git
直接复制该地址到GitHubDesktop中,拉取代码到本地。接下来就是本地编译成库。
1、用Cmake编译
cmake中source code就是从github上clone的文件,这里我放在libhv(自己新建)文件夹,然后构建的文件存放在build(自己新建)的文件夹中
然后点击configure,出现下图
按照自己的VS版本选择就行了,默认x64版本。选择完毕之后就开始了生成,如下图:
生成完毕之后,出现下述下述界面,这里可以做些调整,我不太了解cmake,所以没有更改。
再依次点击Configure,红色消失。
2、VS中生成
点击Generate,出现Generating done (0.8s);Open Project 按钮可以点击,直接打开,在VS中就可以生成库了。
ALL_BUILD,点击生成,快捷键Ctrl+B,生成ALL_BUILD.生成完毕后,在build文件,bin的debug文件夹中找到hv.dll文件,include中是所有头文件,lib是静态lib文件,那debug版本库就完成打包了,同样生成release版。
二、qt中正确使用该库
1、库文件准备:
首先将打包好的库文件整理到一个文件夹中,包括bin文件夹,include文件夹,lib文件夹,里面内容如下图:
提醒:因为昨天搞了半天都没有搞明白怎么在生成的时候,debug版本的文件后有一个d来区分版本,所以只好文件夹区分了,bin文件夹里又分了两个文件夹re和de,同理lib文件夹也是一样。
2、项目新建,.pro文件编写
qt中新建一个项目,这里我的项目名称是:myhvlibProject
然后在.pro文件所在地址,新建一个文件为:thirdparty,第三方库,所有的第三方库文件都放在这里统一管理。然后添加如下代码,就是包含库,然后debug模式和release模式都包含,然后就可以在项目中包含libhv的头文件,使用了。
HV_DIR =$$PWD/thirdparty/libhv
INCLUDEPATH +=$$HV_DIR/include
CONFIG(debug,debug|releasse){
TARGET = myhvlibProjectd
DESTDIR = $$PWD/bin/debug
LIBS += -L$$HV_DIR/lib/de -lhvd
}
CONFIG(release,debug|release){
TARGET = myhvlibProject
DESTDIR = $$PWD/bin/release
LIBS += -L$$HV_DIR/lib/re -lhv
}
3、libhv使用
我这里参考examples中的TcpServer_test.cpp,在main中复制了一下:内容如下:
#include <iostream>
#include "hv/TcpServer.h"
#include "EventLoopTest.h"
using namespace hv;
using namespace std;
#define TEST_TLS 0
int main(int argc, char* argv[]) {
if (argc < 2) {
printf("Usage: %s port\n", argv[0]);
return -10;
}
int port = atoi(argv[1]);
hlog_set_level(LOG_LEVEL_DEBUG);//日志类型改为debug
TcpServer srv;
int listenfd = srv.createsocket(port);//监听端口
if (listenfd < 0) {
return -20;
}
printf("server listen on port %d, listenfd=%d ...\n", port, listenfd);
srv.onConnection = [](const SocketChannelPtr& channel) {
std::string peeraddr = channel->peeraddr();
if (channel->isConnected()) {
printf("%s connected! connfd=%d id=%d tid=%ld\n", peeraddr.c_str(), channel->fd(), channel->id(), currentThreadEventLoop->tid());
} else {
printf("%s disconnected! connfd=%d id=%d tid=%ld\n", peeraddr.c_str(), channel->fd(), channel->id(), currentThreadEventLoop->tid());
}
};
srv.onMessage = [](const SocketChannelPtr& channel, Buffer* buf) {
// echo
printf("< %.*s\n", (int)buf->size(), static_cast<const char*>(buf->data()));
std::string str=static_cast<const char*>(buf->data());
std::string str1=" ,get your message";
std::string str2=str+str1;
//Buffer buf1(mybuf,sizeof(mybuf));
channel->write(str2.data(), str2.size()); // 明确传递数据指针和长度
};
srv.setThreadNum(4);
srv.setLoadBalance(LB_LeastConnections);
#if TEST_TLS
hssl_ctx_opt_t ssl_opt;
memset(&ssl_opt, 0, sizeof(hssl_ctx_opt_t));
ssl_opt.crt_file = "cert/server.crt";
ssl_opt.key_file = "cert/server.key";
ssl_opt.verify_peer = 0;
srv.withTLS(&ssl_opt);
#endif
srv.start();
std::string str;
while (std::getline(std::cin, str)) {
if (str == "close") {
srv.closesocket();
} else if (str == "start") {
srv.start();
} else if (str == "stop") {
srv.stop();
break;
} else {
srv.broadcast(str.data(), str.size());
}
}
return 0;
}
构建程序,程序会提示找不到hv.dll文件,找到对应版本的hv.dll文件,放到项目exe文件夹中:如
我的项目bin-》debug文件中,放入了hv.dll文件,注意是debug坂本,这时候编译就可以过了。
4、项目测试
在上述exe文件下,直接cmd,调出调试界面,
然后输入如下代码:.\myhvlibProject.exe 123,注意后面这个123就是一串数字,作为程序输入,代表Tcp Sever要监听的端口,
输入后点击Enter:
5、NetAssist网络模拟器,模拟Client端与服务器之间通信。
注意这里远程端口需要和上一步中输入的端口一致:123
下面是连接之后,程序和模拟器的样子:
可以在管理员中输入stop停止程序运行,也可以在网络调试助手中通过client向服务器发送消息。同时可以更改代码中的消息处理方式,来尝试各种不同操作。
到这一步就成功了,说明整个库如何在项目中包含,使用已经会了,多加练习熟练后,各种github中的项目都能手到擒来。