【从零开始一步步学习VSOA开发】创建VSOA的server端

news2024/11/14 8:47:23

创建VSOA的server端

创建工程

参考 hellovsoa 工程,创建 server 工程,工程源码修改如下:

#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"


static void command_echo (void *arg, vsoa_server_t *server, vsoa_cli_id_t cid,
                          vsoa_header_t *vsoa_hdr, vsoa_url_t *url, vsoa_payload_t *payload)
{
    struct sockaddr_in addr_in;
    socklen_t          namelen = sizeof(addr_in);

    vsoa_server_cli_address(server, cid, (struct sockaddr *)&addr_in, &namelen);
    printf("client %d addr is %s:%d\n", cid, inet_ntoa(addr_in.sin_addr), ntohs(addr_in.sin_port));
    printf("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_reply(server, cid, 0, vsoa_parser_get_seqno(vsoa_hdr), 0, 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_url_t url;
    url.url     = "/echo";
    url.url_len = strlen(url.url);
    vsoa_server_add_listener(server, &url, command_echo, 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);
}

源码分析:

  1. VSOA 服务端 API 函数更详细说明可以查看博客https://blog.csdn.net/ScilogyHunter/article/details/140816123。
  2. server 端有一个固定框架:创建服务端,设置密码,创建RPC服务(可选),启动微服务和进入监听事件循环。所有服务端基本都按这个框架来写即可,只是配置参数和注册的服务依据实际需求而改动。
  3. 调用vsoa_server_create 函数里创建服务端对象,需要输入一个 json 字符串格式的参数,必须包含 name 字段的微服务名称。
  4. 密码必须设置,否则会认为设置了一个随机密码,影响正常通信,如果确实不想使用密码,输入参数可以设为 NULL。密码是一个没有任何安全加密的字符串,在当前版本中只是一个相对简单的安全管理。
  5. 创建RPC服务是可选项,也可以是发布订阅、数据流或数据报等,具体由业务需求决定。
  6. 启动微服务需要配置自身的 IP地址,支持 ipv4 和 ipv6,IP地址"0.0.0.0"表示任意或全部主机 IP,IP地址“127.0.0.1"表示自回环网卡 IP,只用于本机内部通信。如果开始时绑定的端口为 0,系统将自动分配一个端口。
  7. VSOA 微服务在启动成功之后,它应当始终监听所有的 VSOA 输入事件。
  8. 本示例程序中注册了一个 url 为"/echo"的 RPC 服务,当有客户端调用该服务时,会自动回调注册的command_echo 函数。该函数中限打印客户端信息和 message 信息,然后将接收的message 信息原样”反射“给客户端。
  9. VSOA payload 同时带载 param 和 data,param 推荐格式为 JSON,data 可以是普通二进制数据、字符串、json、 protobuf 等其他格式的载荷。总之不同数据类型使用不同的带载方式可以提高数据吞吐效率。

执行程序

编译、部署、并运行 server 程序,命令行会进入阻塞状态,等待客户端请求。
image.png

安装 vMessenge

VSOA Messenger(简称 vMessenger)是翼辉信息专为 VSOA 微服务开发而设计的测试仿真工具,提供 VSOA 客户端请求、环境变量、模拟服务器和 Proxy 代理管理等功能,方便开发者以更简单直观的方式进行 VSOA 客户端和服务端的开发、调试及数据模拟,从而提升产品开发效率和便利性。
在开发 VSOA 服务端时,开发者可以使用 vMessenger 创建客户端请求,向正在开发的服务端发送请求数据,以验证服务端是否可以正常响应。同样地,在开发 VSOA 客户端时,开发者可以通过 vMessenger 创建一个模拟服务器来模拟服务端接收请求,并返回相应的数据结构,以验证客户端请求信息的准确性。
下载地址:获取 vMessenger 安装包
下载完成后,双击安装包,按照提示安装即可。

使用 vMessenge 工具辅助测试

  1. 新建 vClient 集合。image.png

  2. 新建客户端请求,并配置名称。
    image.png
    image.png

  3. 配置服务端 URL 和密码。
    image.png

  4. 配置请求参数和请求数据。
    image.png
    image.png

  5. 发送请求并查看结果。
    image.png
    image.png

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

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

相关文章

zabbix7.0TLS-02-客户端zabbix-agent部署和配置

文章目录 1 介绍2 工作模式2 部署2.1 RPM 包方式部署 3 配置3.1 配置文件位置3.2 主配置文件布局3.2.1 常规参数3.2.2 高级参数 3.3 部分配置参数详解3.3.1 通用参数3.3.2 被动模式参数3.3.3 主动模式参数 4 测试4.1 Agent 本机测试4.2 在服务端 Zabbix-server 测试和 Agent 的…

Opengl 安装

安装Cmake&#xff1a;Download CMake 安装GLFW&#xff08;source package&#xff09;:An OpenGL library | GLFW glad.dav1d.de 下载glad&#xff0c;选择version3.3 Core --Generate生成。然后点击glad.zip文件下载。 在cmake配置glfw&#xff1a;config-generate 构建GLF…

场外个股期权也可以随时平仓?场外期权行权是什么时候?

今天带你了解场外个股期权也可以随时平仓&#xff1f;场外期权行权是什么时候&#xff1f;A股场外个股有期权&#xff0c;主要对应的标的是沪深交易所上市的个股&#xff0c;除了st、次新股等受到限制&#xff0c;90%的股票都可以购买。 场外个股期权是否可以随时平仓 场外个…

MySQL数据库管理系统在Linux上安装部署

1. MySQL 5.7版本安装 1.1 安装 &#xff08;1&#xff09; 配置yum仓库 # 更新密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 # 安装Mysql yum库 rpm -Uvh http://repo.mysql.com/mysql57-community-release-el7-7.noarch.rpm 注意&#xff1a; 由于M…

OpenCV及rembg去除图像背景

OpenCV去除图像背景 去除图像背景&#xff0c;需要综合使用二值化&#xff08;thresholding&#xff09;、腐蚀&#xff08;erosion&#xff09;、膨胀&#xff08;dilation&#xff09;以及位运算&#xff08;bitwise operations&#xff09;&#xff0c;代码如下&#xff1a…

【独家原创RIME-CNN-LSSVM】基于霜冰优化算法优化卷积神经网络(CNN)结合最小二乘向量机(LSSVM)的数据回归预测

【独家原创RIME-CNN-LSSVM】基于霜冰优化算法优化卷积神经网络(CNN)结合最小二乘向量机(LSSVM)的数据回归预测 目录 【独家原创RIME-CNN-LSSVM】基于霜冰优化算法优化卷积神经网络(CNN)结合最小二乘向量机(LSSVM)的数据回归预测效果一览基本介绍程序设计参考资料 效果一览 基本…

成品油综合监管云平台:系统功能全方位解析

成品油综合监管云平台&#xff0c;作为集数据收集、统计分析、监管、预警应急安全等功能于一体的信息化监管系统&#xff0c;正逐步成为政府监管部门提升管理效率、保障市场秩序的重要工具。 本文将详细解析成品油综合监管云平台的多项核心功能&#xff0c;展现其在现代成品油…

习题2.31

先上代码 (defn square [x](* x x)) (defn square-tree[tree](tree-map square tree) )(defn tree-map [op tree](cond (not (seq? tree)) (op tree)(empty? tree) nil:else (cons (tree-map op (first tree)) (tree-map op (rest tree)))) )题目实际上是想让我们将树的遍历…

【网络】|wireshark

1、wireshark 1.12的使用 参考: https://blog.csdn.net/xb_zed/article/details/116305363 重点&#xff1a; 1.1 设置混杂模式

从0开始搭建vue + flask 旅游景点数据分析系统(七):可视化前后端对接实现

这一期继续编写flask后端&#xff0c;并且完成echarts折线图、柱状图和饼图的对接。 1 新增一些依赖 pip install Flask-SQLAlchemy Flask-Marshmallow pymysql修改 init.py文件&#xff0c;下面给出完整代码&#xff1a; from flask import Flask from flask_sqlalchemy im…

Studying-代码随想录训练营day57| prim算法精讲、kruskal算法精讲

第57天&#xff0c;图论07&#xff0c;两个最小生成树算法的讲解&#x1f4aa;(ง •_•)ง&#x1f4aa;&#xff0c;编程语言&#xff1a;C 目录 题目&#xff1a;53. 寻宝&#xff08;第七期模拟笔试&#xff09; (kamacoder.com) prim算法精讲 拓展 总结&#xff1a; …

新手小白嵌入式单片机教程,ESP32

1.什么是ESP32。 ESP32是一款由乐鑫信息科技&#xff08;Espressif Systems&#xff09;推出的高度集成的低功耗系统级芯片&#xff08;SoC&#xff09;&#xff0c;它结合了双核处理器、无线通信、低功耗特性和丰富的外设&#xff0c;特别适用于各种物联网&#xff08;IoT&am…

RabbitMQ如何保证可靠性

在RabbitMQ中可以将消息传递的链路简化成如下图&#xff1a; 从上图可以发现&#xff0c;主要分为三个角色&#xff1a;Producer、Consumer、RabbitMQ Broker 正常情况下&#xff0c;Producer生产消息&#xff0c;安全的到打Broker的Exchange&#xff0c;然后根据转发规则&…

springboot新农村综合展示平台-计算机毕业设计源码41793

摘 要 新农村综合展示平台是利用微信小程序开发的一种新型农村信息展示和交流平台&#xff0c;旨在通过数字化技术手段推动乡村振兴&#xff0c;促进农村资源整合和信息共享。本论文通过对新农村发展现状和需求进行分析&#xff0c;结合微信小程序开发技术&#xff0c;设计并实…

【Tessent】【Command】set_design_level Design Level

UsageDescriptionphysical_block vs. sub_blockinstrument_block set_design_level 命令的基本内容&#xff0c;以及不同 design level 之间的区分。 Usage 该命令的用法比较简单&#xff0c;主要是区分不同的 design level。 set_design_level {chip | physical_block | sub…

C++三种继承方式-公共/保护/私有继承

public、protected和private的区别在于&#xff1a; public在子类和类外都可以随意访问。 protected在子类中可以访问&#xff0c;但是在类外无法访问。 private在子类和类外都无法访问。 注意&#xff1a;父类中的所有非静态成员属性都会被子类继承下去&#xff0c;包括私有…

项目比赛项目负责人的汇报艺术:清晰、有条理地反映问题

项目比赛项目负责人的汇报艺术&#xff1a;清晰、有条理地反映问题 前言1. 现状-问题-建议&#xff1a;三步走策略2. 成绩-问题-改进&#xff1a;展示与提升3. 事实-影响-请求&#xff1a;客观与明确结语 前言 在项目管理的世界里&#xff0c;沟通不仅仅是信息的传递&#xff0…

进程的管理与控制详解:创建、终止、阻塞等待与非阻塞等待

目录 一、进程创建 1、实例 2、fork函数详解 (1)fork函数模板 (2). fork() 函数的工作原理 (3). fork() 返回值和错误处理 3、如何理解进程创建过程 二、进程终止 1、终止是在做什么&#xff1f; 2、进程终止&#xff0c;有三种情况 3、进程如何终止&#xff1f; 三…

变电站的瞬态过电压和雷击保护

瞬态过电压是电力系统的典型现象。过电压的来源是直接或附近的雷击、开关操作、电磁脉冲和静电放电。保护变电站设备免受瞬态过电压影响的经典装置是避雷器。 变电站常见的暂态过电压来自于开关操作&#xff0c;可怕的是雷电&#xff0c;它会带来较大的扰动。 雷击引起的瞬态…

ClickHouse 进阶【建表、查询优化】

1、ClickHouse 进阶 因为上一节部署了集群模式&#xff0c;所以需要启动 Zookeeper 和 ck 集群&#xff1b; 1.1、Explain 基本语法 EXPLAIN [AST | SYNTAX | PLAN | PIPELINE] [setting value, ...] SELECT ... [FORMAT ...] AST&#xff1a;用于查看语法树SYNTAX&#…