libhv学习——TcpSever基础学习

#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中的项目都能手到擒来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值