把teamtalk中的网络库(netlib)拆出来单独测试实现双工通信效果

news2024/11/18 1:23:47

这篇文章的基础是上一篇对于将teamtalk中的线程池,连接池单独拆出来的讲解
不是说这个网络库会依赖线程池,连接池,而是上一篇文章中讲了一些base目录中的文件,并且这个网络库会依赖一些base目录里的文件, 文末会将所有文件一起打包以百度网盘链接的形式提供

teamtalk中的网络库主要包含的文件为:
netlib.h , netlib.cpp, EventDispatch.cpp, EventDispatch.h, BaseSocket.cpp, BaseSocket.h

测试案例使用cmake的方式组织
cmake代码:

cmake_minimum_required(VERSION 2.6)
project(test_netlib)

SET(EXECUTABLE_OUTPUT_PATH  ./)
#AUX_SOURCE_DIRECTORY(../base SRC_LIST)

ADD_DEFINITIONS( -g -W -Wall -D_REENTRANT -D_FILE_OFFSET_BITS=64 -DAC_HAS_INFO
-DAC_HAS_WARNING -DAC_HAS_ERROR -DAC_HAS_CRITICAL -DTIXML_USE_STL
-DAC_HAS_DEBUG -DLINUX_DAEMON -std=c++11 -DENCRYPT)

INCLUDE_DIRECTORIES(../base ../db_proxy_server)
#LINK_DIRECTORIES(./ ../base ../../base)

ADD_EXECUTABLE(client ./client.cpp )
ADD_EXECUTABLE(server ./server.cpp )

TARGET_LINK_LIBRARIES(client base slog)

TARGET_LINK_LIBRARIES(server base slog)

这里我使用teamtalk的网络库实现了一个双工通信效果的代码(客户端,服务端可以随意发消息)
客户端代码

#include "netlib.h"
#include "BaseSocket.h"
#include "EventDispatch.h"
#include <pthread.h>
#include <iostream>

using namespace std;

//因为netlib网络库的回调函数的参数形式就是这样
void* send_msg(void* handle) {
    int fd = *(int*)handle;
    while(1) {
        CBaseSocket* pSocket = FindBaseSocket(fd);
        string str;
        cin >> str;
        str += '\n';
        int ret = netlib_send(fd, (void*)str.c_str(), str.length() + 1);
    }
}
void imconn_callback(void* callback_data, uint8_t msg, uint32_t handle, void* pParam)
{
   switch(msg) {
    case NETLIB_MSG_READ:
    {
        CBaseSocket* pSocket = FindBaseSocket(handle);
        if(!pSocket) {
        return ;
        }
        char buf[64] = {0};
	    int ret = netlib_recv(handle, buf, 64);
        buf[ret] = '\0';
        cout << buf ;
    }
    break;
    case NETLIB_MSG_WRITE:
    {
        //
    }
    break;
   }
}

int main() {
    netlib_init();
    net_handle_t handle = netlib_connect("127.0.0.1", 6666, imconn_callback, NULL);
    CBaseSocket* pSocket = FindBaseSocket(handle);
    if(!pSocket) {
        return 0;
    }
    pSocket->SetState(SOCKET_STATE_CONNECTED);
    pthread_t pt;
    pthread_create(&pt, NULL, send_msg, &handle);
    netlib_eventloop(10);
    return 0;
}

服务端代码

#include "netlib.h"
#include "BaseSocket.h"
#include "EventDispatch.h"
#include <iostream>
#include <pthread.h>

using namespace std;
void* send_msg(void* handle) {
    int fd = *(int*)handle;
    while(1) {
        CBaseSocket* pSocket = FindBaseSocket(fd);
        string str;
        cin >> str;
        str += '\n';
        int ret = netlib_send(fd, (void*)str.c_str(), str.length() + 1);
    }
}
void imconn_callback(void* callback_data, uint8_t msg, uint32_t handle, void* pParam) {
    switch(msg) {
    case NETLIB_MSG_READ:
    {
        CBaseSocket* pSocket = FindBaseSocket(handle);
        char buf[64] = {0};
        int ret = netlib_recv(handle, buf, 64);
        buf[ret] = '\0';
        cout << buf;
        //ret = netlib_send(handle, buf, ret);
        //cout << ret << endl;
    }
    break;
    case NETLIB_MSG_WRITE:
    {
        //
    }
    break;
   }
}
void serv_callback(void* callback_data, uint8_t msg, uint32_t handle, void* pParam)
{
    if(msg == NETLIB_MSG_CONNECT) {
        netlib_option(handle, NETLIB_OPT_SET_CALLBACK, (void*)imconn_callback);
        CBaseSocket* pSocket = FindBaseSocket(handle);
        if(!pSocket) {
            return ;
        }
        pSocket->SetState(SOCKET_STATE_CONNECTED);
        pthread_t pt;
        pthread_create(&pt, NULL, send_msg, &handle);
    }
}

int main() {
    netlib_init();
    int handle = netlib_listen("127.0.0.1", 6666, serv_callback, NULL);
    netlib_eventloop(10);
    return 0;
}

注意点:
在上一篇拆分线程池,连接池的文章的基础上,我这里只提供在上一篇的基础上新增的文件,若需要完整的可以把上一篇文章的链接内容下载下来,再将这一篇的添加上去。

怎么添加? 只需要把我最开始提到的那几个网络库需要的文件放到base目录中, 然后重新编译一下libbase.a这个库(怎么编译会在后边讲到,用cmake的方式,这个库是将base目录的所有文件编译而来),并且放到/usr/local/lib 或者 /urs/local/lib中, 而我写的客户端以及服务器放到与base目录的同级目录下。
目录结构如下:红框为新增的
在这里插入图片描述
上一篇没有讲解base目录中的源文件如何以cmake的方式管理,这里补充一下
在base目录中,touch CMakeList.txt
内容如下:

SET(PB_LIB_DIR ./pb/lib/linux)
SET(LIBRARY_OUTPUT_PATH ./)

ADD_DEFINITIONS( -g -W -Wall -D_REENTRANT -D_FILE_OFFSET_BITS=64 -DAC_HAS_INFO
-DAC_HAS_WARNING -DAC_HAS_ERROR -DAC_HAS_CRITICAL -DTIXML_USE_STL
-DAC_HAS_DEBUG -DLINUX_DAEMON)

INCLUDE_DIRECTORIES(./ ../)
LINK_DIRECTORIES(./ ${PB_LIB_DIR} )

ADD_LIBRARY(base STATIC ${SRC_LIST1} )#*${SRC_LIST2} ${SRC_LIST3})
TARGET_LINK_LIBRARIES(base pthread slog protobuf-lite)

提示一下,libbase.a, libslog.so等库资源文件建议放到/usr/lib 或者 /usr/local/lib下

链接:https://pan.baidu.com/s/1g31MlF-OoeVmhKAc0FA1mg?pwd=qjj9
提取码:qjj9

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/129950.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于fpga的自动售货机(三段式状态机)

目录 1、VL38 自动贩售机1 题目介绍 思路分析 代码实现 仿真文件 2、VL39 自动贩售机2 题目介绍&#xff1a; 题目分析 代码实现 仿真文件 3、状态机基本知识 1、VL38 自动贩售机1 题目介绍 设计一个自动贩售机&#xff0c;输入货币有三种&#xff0c;为0.5/1/2元&…

JS概览 (JS基础 DOM BOM)

目录 JavaScript JS基础 JS数据类型 函数 变量的作用域 作用域链 预解析 DOM DOM树 获取元素的方法 事件高级 注册和解绑事件 DOM事件流 BOM 和DOM的区别 window 对象的常见事件 window.onload JS执行机制 具体的执行流程 例子 JavaScript JS基础 JS数据类…

鉴源论坛 · 观模丨基于AUTOSAR的TTCAN通信协议的形式化建模与分析

作者 | 郭建 上海控安可信软件创新研究院特聘专家 版块 | 鉴源论坛 观模 汽车工业发展至今&#xff0c;硬件方面如车身材料、发动机等已无太大升值空间&#xff0c;而汽车电子则有着广阔的前景。为此各大汽车厂商对汽车电子的研究都投入了大量的人力财力。2003 年&#xff0c…

链式二叉树的代码总结

今天我带来链式二叉树的代码总结。 目录前言链式二叉树代码实现的五个文档二叉树的例子前序遍历中序遍历后序遍历层序遍历求结点个数的函数求叶子的个数的函数求k层结点个数的函数查找某一个值的函数求二叉树高度的函数判断二叉树是否是完全二叉树的函数开辟二叉树结点的函数销…

【设计模式】工厂方法模式

简单工厂模式的弊端 在简单工厂模式中只提供一个工厂类&#xff0c;该工厂类处于对产品类进行实例化的中心位置&#xff0c;它需要知道每一个产品对象的创建细节&#xff0c;并决定何时实例化哪一个产品类。简单工厂模式最大的缺点是当有新产品要加入到系统中时&#xff0c;必…

实现isReactive和isReadonly

08_实现isReactive和isReadonly 一、实现isReactive isReactive: 检查一个对象是否是由 reactive 创建的响应式代理。 1. 单元测试 // src/reactivity/tests/reactive.spec.tsimport { reactive, isReactive } from ../reactive;describe(reactive, function () {it(happy pa…

Callable接口

前言 获取多线程的方法&#xff0c;我们都知道有三种&#xff0c;还有一种是实现Callable接口 实现Runnable接口实现Callable接口实例化Thread类使用线程池获取Callable接口 Callable接口&#xff0c;是一种让线程执行完成后&#xff0c;能够返回结果的 在说到Callable接口…

【Unity天空盒】卡通渲染中如何实现云的消散效果

写在前面 完成大气渲染之后&#xff0c;接下来就是考虑云渲染了。因为我想做的天空盒本身是想跟着这位大佬Unity 卡通渲染 程序化天空盒 - 知乎里叙述的进程来的&#xff0c;里面云实现的是原神里的云&#xff0c;原神又是在崩3的基础上加上了消散效果。但现在能找到的一些教程…

线程中的sleep, yield, join

1. 前言 今天以具体实例的方法来详细记录下实战中的sleep, yield, join。 到底是什么意思&#xff0c;应该怎么用呢&#xff1f;&#xff1f;&#xff1f; 2. 适合人群 对该类方法的概念比较模糊的人 3. 开始 3.1 sleep 此方法是一个静态方法&#xff0c;可以通过类名直接调…

【MyBatis】安装 + 框架搭建 + 使用 + 优化(全程一条龙服务讲解~)

目录 前言 一、准备工作 1.1、下载MyBatis 1.2、数据库设计 二、搭建框架 2.1、创建Maven项目 2.2、jar包、引入依赖 2.3、创建MyBatis核心配置文件 2.4、映射文件 2.5、通过junit测试功能 2.6、框架优化 三、小结——注意事项 前言 本篇全程从0到1搭建MyBatis框架…

Python编程 简单春节倒计时教程(附源代码)

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.应用的技术 1.Tkinter 2.PHotoimage 函数 3.label组件 二.效果图 三…

pytorch 咖啡豆识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章地址&#xff1a; 365天深度学习训练营-第P6周&#xff1a;好莱坞明星识别&#x1f356; 作者&#xff1a;K同学啊一、前期准备 1.设置GPU import torch from torch import nn …

2022 年 pnpm 为什么这么火?

pnpm是 Node.js 的替代包管理器。它是 npm 的直接替代品&#xff0c;但速度更快、效率更高。 为什么更有效率&#xff1f;当你安装一个包时&#xff0c;我们将它保存在你电脑上的全局存储中&#xff0c;然后我们从它创建一个硬链接而不是复制。也就是说&#xff1a;对于模块的…

8.移动端学习-rem适配方案

1.适配方案 1、当设备尺寸发生变化时&#xff0c;页面宽高等比例变化 2、使用媒体查询根据不同设备按比例设置html字体大小&#xff0c;页面元素使用rem做单位&#xff0c;当html字体大小变化&#xff0c;元素尺寸也会发生变化&#xff0c;从而达到等比缩放的适配 2.rem实际开…

ubuntu18.04运行ORB_SLAM2

1、基础工具安装 安装cmake、git、gcc、g。 sudo apt-get install cmake git gcc g 2、安装Eigen库 在终端输入以下代码。 sudo apt-get install libeigen3-dev 3、安装Pangolin0.5 版本过高会导致错误&#xff0c;安装依赖项。 sudo apt-get install libglew-dev libpyth…

Hadoop之Hdfs

一、基本概述 1、定义 HDFS&#xff08;Hadoop Distributed File System&#xff09;&#xff0c;它是一个文件系统&#xff0c;用于存储文件&#xff0c;通过目 录树来定位文件&#xff1b;其次&#xff0c;它是分布式的。HDFS 的使用场景&#xff1a;适合一次写入&#xff0…

这是长新冠,还是我老了?浙江出国抢订单又抢CTO;脉脉发布人才迁徙报告;元宇宙产业生态图谱;GitHub今日热榜 | ShowMeAI资讯日报

&#x1f440;日报合辑 | &#x1f3a1;AI应用与工具大全 | &#x1f514;公众号资料下载 | &#x1f369;韩信子 &#x1f3a1; 这是长新冠&#xff0c;还是我老了&#xff1f; 感染后身体出现了疲劳、关节疼痛、咳嗽等新症状&#xff1f;你并不孤单&#xff01;约翰霍普金斯…

数据结构进阶 二叉树OJ题一

作者&#xff1a;小萌新 专栏&#xff1a;数据结构进阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍几道二叉树的oj题 二叉树OJ题题目一 根据二叉树创建字符串题目二 二叉树的层序遍历题目三 二叉树的最近公共祖先题目一 根据…

自动化信息治理:推动价值、安全性和合规性

现代组织充斥着数据&#xff0c;但信息的洪流可能变得势不可挡&#xff0c;危及利用其价值的能力。内容服务解决方案能够减轻洪水泛滥的风险&#xff0c;并帮助组织更好地控制信息。 从信息中获取价值的不同之处在于治理。建立正确的治理框架&#xff0c;组织可以最大限度地利…

难以挖掘的真相——塑料版薯条、意大利面、披萨……

下方图片中的“美食”&#xff0c;看起来是不是十分美味&#xff1f; ▲莱佛士平面设计学生作品 可千万要擦亮眼睛&#xff0c;它们其实是&#xff1a;黄色瓶盖“蛋黄”的荷包蛋&#xff0c;黄色吸管的“薯条”&#xff0c;桔黄色的塑料带子“意大利面”&#xff0c;红色塑料袋…