【从零开始一步步学习VSOA开发】VSOA数据报

news2024/9/23 3:32:28

VSOA数据报

概念

Datagram 是 VSOA 的一种数据传输类型,通常这种类型用于传输一些不需要确认的数据,例如传输视频流数据或构建 VPN 网络。

Datagram 可以简单快速的在网络中传输数据。它即不需要建立连接,也不需要维护连接,因此可以更快地传输数据。VSOA 提供了⼀套全新的、接口简洁的 Datagram,具有如下特征:

  • Datagram 对故障有较强的适应性。若某条链路发生故障,数据报可以绕过这些故障路径选择其他路径,将数据报传送到目的节点。
  • Datagram 传输不需要建立连接。目的节点接收数据报后,也不需要发送确认,通信开销较小。

客户端和服务端建立连接后,双方均可发送和接收 VSOA Datagram。发送使用直接调用函数方式;而接收使用事件机制,需要绑定一个接收回调函数。

基于数据报也可以实现类似 RPC 或发布订阅功能,RPC 或发布订阅可以绑定到了具体的 url 服务地址,而数据报只绑定到了服务端地址,业务上可以通过携带的 url 参数来自行实现子一级功能和 url 匹配关系。 RPC 或发布订阅可以建立多个,而数据报一个客户和一个服务端只能建立一个。

服务端源码

参考原 echo RPC 服务例程源码,改用 datagram 方式实现一个类似的 echo 服务。去掉 RPC 服务相关操作,注册 datagram 回调函数,回调函数中首先打印客户端和 message 信息,然后使用 datagram 方式将数据原样反射给客户端。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "vsoa_platform.h"
#include "vsoa_server.h"

#define MY_SERVER_ADDR                      "0.0.0.0"
#define MY_SERVER_PORT                      (4001)
#define MY_SERVER_NAME                      "{\"name\":\"echo_server\"}"
#define MY_SERVER_PASSWD                    "123456"

void datagram_callback(void *arg, vsoa_server_t *server, vsoa_cli_id_t cid,
                      vsoa_url_t *url, vsoa_payload_t *payload, bool quick)
{
    struct sockaddr_in addr_in;
    socklen_t          namelen = sizeof(addr_in);

    vsoa_server_cli_address(server, cid, (struct sockaddr *)&addr_in, &namelen);
    printf("datagram client %d addr is %s:%d\n", cid, inet_ntoa(addr_in.sin_addr), ntohs(addr_in.sin_port));
    printf("datagram message, url:%.*s, param:%.*s, data:%.*s\n",
           (int)url->url_len, url->url,
           (int)payload->param_len, payload->param,
           (int)payload->data_len, (char *)payload->data);

    vsoa_server_cli_datagram(server, cid, url, payload);
}

int main (int argc, char **argv)
{
    vsoa_server_t *server;

    /*
    * 创建服务端
    */
    server = vsoa_server_create(MY_SERVER_NAME);
    if (!server) {
        fprintf(stderr, "Can not create VSOA server!\n");
        return  (-1);
    }

    /*
    * 设置密码,设置为NULL,表示密码为空,客户端可以不输入密码
    */
    vsoa_server_passwd(server, MY_SERVER_PASSWD);

    /*
    * 创建RPC服务
    */
    vsoa_server_on_datagram(server, datagram_callback, NULL);

    /*
    * 启动微服务
    */
    struct sockaddr_in addr;
    bzero(&addr, sizeof(struct sockaddr_in));
    addr.sin_family      = AF_INET;
    addr.sin_port        = htons(MY_SERVER_PORT);
    addr.sin_addr.s_addr = inet_addr(MY_SERVER_ADDR);
    addr.sin_len         = sizeof(struct sockaddr_in);

    if (!vsoa_server_start(server, (struct sockaddr *)&addr, sizeof(struct sockaddr_in))) {
        vsoa_server_close(server);
        fprintf(stderr, "Can not start VSOA server!\n");
        return  (-1);
    }

    /*
    * 进入监听事件循环
    */
    while (1) {
        int     cnt;
        int     max_fd;
        fd_set  fds;
        struct timespec timeout = {1, 0 };

        FD_ZERO(&fds);
        max_fd = vsoa_server_fds(server, &fds);

        cnt = pselect(max_fd + 1, &fds, NULL, NULL, &timeout, NULL);
        if (cnt > 0) {
            vsoa_server_input_fds(server, &fds);
        }
    }

    return (0);
}

客户端源码

参考原 echo RPC 客户端例程源码,改用 datagram 方式实现一个类似的 echo 服务请求。去掉 RPC 相关操作,先注册datagram 接收回调,然后在主循环里每秒进行一次datagram 发送操作。datagram 在接收回调中打印接收信息。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/select.h>
#include "vsoa_client.h"
#include "vsoa_cliauto.h"

#define MY_SERVER_PASSWD                    "123456"

static void datagram_callback(void *arg, vsoa_client_t *client, vsoa_url_t *url,vsoa_payload_t *payload, bool quick)
{
    printf("datagram echo message, url:%.*s, quick:%s\n",
            (int)url->url_len, url->url,
            quick ? "ture":"false");

    printf("datagram echo message, param:%.*s, data:%.*s\n",
               (int)payload->param_len, payload->param,
               (int)payload->data_len, (char *)payload->data);
}

int main (int argc, char **argv)
{
    vsoa_client_t *client;
    vsoa_client_auto_t *cliauto;

    /*
     * 创建客户端机器人
     */
    cliauto = vsoa_client_auto_create(NULL, NULL);
    /*
     * 由客户端机器人获取客户端对象
     */
    client  = vsoa_client_auto_handle(cliauto);

    vsoa_client_on_datagram(client, datagram_callback, NULL);
    /*
     * 启动客户端机器人
     */
    vsoa_client_auto_start(cliauto, "vsoa://echo_server", MY_SERVER_PASSWD, NULL, 0, 1000, 1000, 1000);

    while (true) {
        /*
         * 检查客户端是否正常链接到服务端
         */
        if (vsoa_client_is_connect(client) == false) {
            continue;
        }
        /*
         * 发送datagram请求
         */
        vsoa_url_t url;
        vsoa_payload_t send;
        url.url     = "/echo";
        url.url_len = strlen(url.url);
        send.data = "1234567";
        send.data_len = strlen(send.data);
        send.param = "abcdefg";
        send.param_len = strlen(send.param);
        vsoa_client_datagram(client, &url, &send);

        sleep(1);
    }
}

执行效果

服务端执行效果:
image.png
客户端自行效果:
image.png

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

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

相关文章

GESP 一级 比赛

出错了 - 洛谷https://www.luogu.com.cn/contest/190441#problems 邀请码&#xff1a;zura 有讲解哦&#xff01;

SCAU学习笔记 - 高级语言程序设计课后习题

写在前面 趁着暑假赶紧把C语言的习题也补了 也欢迎看到这篇博客的小灯们来到华南农业大学喵 专栏里还有后续其他部分课程的学习笔记 如何提交自己的代码 首先给各位说一下这门课程的要求&#xff0c;首先是我们学校的校内OJ&#xff0c;我们计算机类专业的学生用的是前面这个…

突破 ES 引擎局限性在用户体验场景中的优化实践

回顾&#xff1a;ES 慢上游响应问题优化在用户体验场景中的实践-CSDN博客 上文介绍了用户体验管理平台&#xff08;简称 VoC&#xff09;在针对 ES 慢上游响应场景下的优化实践&#xff0c;本文继续介绍针对第二个痛点问题——ES 引擎局限性的性能优化实践进行介绍。 下文以搜…

MaxKB:基于 LLM大语言模型的知识库问答系统实操

1.MaxKB介绍 MaxKB 是一款基于 LLM&#xff08;Large Language Model&#xff09;大语言模型的知识库问答系统。MaxKB 的产品命名内涵为 “Max Knowledge Base”&#xff0c;为用户提供强大的学习能力和问答响应速度&#xff0c;致力于成为企业的最强大脑。与同类基于 LLM 的知…

数值分析【4】

目录 ​编辑第六章 数值积分微分 龙贝格 高斯求积 查表&#xff1f; 插值求导 两点 ​编辑 三点​编辑 第七章 ode 龙哥库塔 线性多步法 第八章 eig 幂法&#xff1a;v-》Av-》AAv-》……​编辑 反幂法 每次成得是A逆&#xff0c;这样得到摸最小的特征值​编辑 Q…

【IEEE独立出版】第四届计算机科学与区块链国际学术会议 (CCSB 2024)

第四届计算机科学与区块链国际学术会议 (CCSB 2024) 2024 4th International Conference on Computer Science and Blockchain 2024年9月6-8日 中国-深圳 老牌会议 | 涵盖计算机学科 | 往届均完成见刊、稳定检索 | 论文录用速度快 | 有ISBN号! *关于IEEE出版社 电气电子工…

使用ant design的modal时,发现自定义组件的样式(组件高度)被改变了!

一 问题描述 在项目中&#xff0c;自定义了一个组件&#xff0c;分别在界面和 antd的modal中都有使用到。但是突然发现&#xff0c;界面中的组件样式跟modal中的组件样式高度不一样。modal中的组件整体要比页面中的组件要高一点。 项目中的自定义组件比较复杂&#xff0c;因此&…

C#使用Puppeteer

Puppeteer Puppeteer是一个Node.js库&#xff0c;它提供了高级API来通过DevTools协议(Chrome DevTools Protocol https://devtools.chrome.com)控制Chrome或Chromium。 Puppeteer默认情况下无头运行(headless)。 可以配置为运行完整的Chrome或Chromium&#xff0c;运行效果如…

【中项】系统集成项目管理工程师-第11章 项目范围管理-11.2收集需求

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

开源AI搜索平台Search4All

什么是 Search4All &#xff1f; Search4All 是个人 AI 搜索协助工具&#xff0c;是 Perplexity 的开源替代品。能让你的 LLM API 支持联网&#xff0c;搜索、新闻、网页总结&#xff0c; 软件特点&#xff1a; 集成对 LLM 的支持&#xff0c;例如 OpenAI、Groq 和 Claude。本…

【学习笔记】Day 8

写在开头&#xff1a; 最近老板突然提出一个全新的组会主题&#xff0c;是关于 “最近我犯的傻”&#xff0c;其目的在于提供乐子的同时引以为戒。本来我还在愁到底去哪里找干的啥事儿&#xff0c;结果今天直接拉了个大的。什么叫无心插柳柳成荫啊&#xff0c;悲。 一…

亿达科创亮相智造数字科技大会

8月8日&#xff0c;IMC2024第七届智造数字科技大会在京启幕。大会以“乘‘数’而上”为题&#xff0c;邀请300智能制造行业数字化转型技术大咖、领军者及实践者共聚一堂&#xff0c;解读智造行业转型进程。亿达科创受邀参会&#xff0c;分享企业前沿数字技术、解决方案与创新实…

Java面试篇(线程池相关专题)

文章目录 1. 为什么要使用线程池2. 线程池的核心参数和线程池的执行原理2.1 线程池的核心参数2.2 线程池的执行原理 3. 线程池中常见的阻塞队列3.1 常见的阻塞队列3.2 ArrayBlockingQueue 和 LinkedBlockingQueue 的区别 4. 如何确定线程池的核心线程数4.1 应用程序中任务的类型…

开源AI智能名片小程序在私域流量运营中的“及时法则”深度应用与策略探讨

摘要&#xff1a;在数字化浪潮的推动下&#xff0c;私域流量已成为企业构建长期竞争优势的关键要素。开源AI智能名片小程序&#xff0c;凭借其智能化、个性化及高度可定制化的特性&#xff0c;正逐步成为私域流量运营的重要工具。本文深入探讨了“及时法则”在开源AI智能名片小…

模型量化——NVIDIA——QAT

概述 QAT 截止目前(20230418)的CUDA 实现并不在pytorch 原生包中(不等同于pytorch 的QAT,它主要支持CPU),需要引入NVIDIA 的第三方包“pytorch-quantization”。需要TRT8+ 、 pytorch 1.8 +。主要流程如下: 工具流转方向如下: 所以目前我的理解+咨询了NVIDIA官…

【代码随想录】螺旋矩阵II

本博文为代码随想录的学习笔记&#xff0c;原文链接&#xff1a;代码随想录 题目 原题链接&#xff1a;59. 螺旋矩阵 II 给你一个正整数 n &#xff0c;生成一个包含 1 到 n^2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xf…

【Linux】lvm被删除或者lvm丢失了怎么办

模拟案例 接下来模拟lvm误删除如何恢复的案例&#xff1a; 模拟删除&#xff1a; 查看vg名&#xff1a; vgdisplayvgcfgrestore --list uniontechos #查看之前的操作 例如我删除的&#xff0c;现场没有删除就用最近的操作文件&#xff1a; 还原&#xff1a; vgcfgrestore…

1Panel应用推荐:KubePi开源Kubernetes管理面板

1Panel&#xff08;github.com/1Panel-dev/1Panel&#xff09;是一款现代化、开源的Linux服务器运维管理面板&#xff0c;它致力于通过开源的方式&#xff0c;帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用&#xff0c;1Panel特别开通应用商店&am…

扩展02:Haporxy+Keepalived+Mysql高可用集群实战

由于这个架构和扩展01的大致步骤都相同&#xff0c;就不讲解了。看如下图再参考扩展01即可。

用C语言实现链式存储结构 万字

各位同学&#xff0c;大家好&#xff0c;我叫小敖。今天给大家分享数据结构之一链式存储结构&#xff0c;下面是对链表简单介绍&#xff0c;希望大家能理解。 链表介绍 链表是一种物理存储单元上非连续、非顺序的存储结构**&#xff0c;数据元素的逻辑顺序是通过链表中的指针链…