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

news2024/11/12 21:27:45

创建VSOA的client端

创建工程

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

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

#define MY_SERVER_ADDR                      "127.0.0.1"
#define MY_SERVER_PORT                      (4001)
#define MY_SERVER_NAME                      "{\"name\":\"echo server\"}"
#define MY_SERVER_PASSWD                    "123456"

static void on_command_echo (void *arg, struct vsoa_client *client, vsoa_header_t *vsoa_hdr, vsoa_payload_t *payload)
{
    printf("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)
{
    bool ret;
    struct timespec timeout = {1, 0 };
    vsoa_client_t *client;

    /*
     * 创建客户端
     */
    client = vsoa_client_create(NULL, NULL);
    if (!client) {
        fprintf(stderr, "Can not create VSOA client!\n");
        return  (-1);
    }

    /*
    * 连接服务端
    */
    struct sockaddr_in addr;
    char info[256];

    bzero(&addr, sizeof(struct sockaddr_in));
    bzero(info, sizeof(info));
    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_client_connect(client, (struct sockaddr *)&addr, sizeof(struct sockaddr_in),
                             &timeout, MY_SERVER_PASSWD, info, sizeof(info))) {
        vsoa_client_close(client);
        fprintf(stderr, "Can not connect to VSOA server!\n");
        return  (-1);
    }
    printf("Server (%s) connected\n", info);


    /*
     * 注册异步RPC请求
     */
    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);
    ret = vsoa_client_call(client, VSOA_CLIENT_RPC_METHOD_GET, &url, &send, on_command_echo, NULL, NULL);
    if (!ret) {
        fprintf(stderr, "Asynchronous RPC call error (not connected to server)!\n");
    }
    /*
    * 进入监听事件循环
    */
    while (1) {
        int max_fd;
        int cnt;
        fd_set fds;

        FD_ZERO(&fds);
        max_fd = vsoa_client_fds(client, &fds);

        cnt = pselect(max_fd + 1, &fds, NULL, NULL, &timeout, NULL);
        if (cnt > 0) {
            if (!vsoa_client_input_fds(client, &fds)) {
                fprintf(stderr, "Connection lost!\n");
                return  (-1);
            }
        }
    }
}

源码分析:

  1. VSOA 客户端 API 函数更详细说明可以查看博客https://blog.csdn.net/ScilogyHunter/article/details/140817028。
  2. 客户端有一个固定框架:创建客户端,连接服务端,注册异步RPC请求(可选)进入监听事件循环。用户客户端程序可以参考这个框架来写,只是配置参数和注册的请求依据实际需求而改动。
  3. 调用vsoa_client_create 函数可以创建客户端对象,创建时可以选择配置订阅函数和参数。
  4. 连接服务端时需要配置服务端的的 IP地址及端口号,支持 ipv4 和 ipv6,IP地址“127.0.0.1"表示自回环网卡 IP,只用于本机内部通信。设置连接超时时间和密码。执行成功可以返回服务端信息。
  5. 注册异步RPC请求。这里配合前面 server 例程,注册了一个异步RPC请求,需要配置匹配的 url,提供发送数据和回调函数。注册完毕后可继续处理其他事项,在后面正常链接服务端,发送 RPS 请求并正常得到回复后就会回调on_command_echo 函数。
  6. 待准备工作全部完成后,它应当始终监听所有的 VSOA 输入事件。

执行程序

  1. 先启动服务端程序。
  2. 另外启动一个人 telnet 客户端,执行客户端程序。
  3. 查看客户端和服务端的打印信息。
    image.png
    image.png

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

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

相关文章

全球情绪检测与识别市场规划预测:2030年市场规模将接近3166亿元,未来六年CAGR为22.6%

一、引言 随着人工智能和机器学习技术的飞速发展&#xff0c;情绪检测与识别在多个领域的应用日益广泛&#xff0c;其市场潜力日益凸显。本文旨在探索情绪检测与识别行业的发展趋势、潜在商机及其未来展望。 二、市场趋势 全球情绪检测与识别市场的增长主要受人工智能和机器学…

【mathtype】word中如何输入4×4的矩阵,甚至阶数更多

在写论文或者使用word操作的时候&#xff0c;我们可能会使用矩阵插入我们所写的word中&#xff0c;今天小编就分享一下如何在word中输入矩阵。首先&#xff0c;我们word中需要安装mathtype的插件。 ①打开word&#xff0c;鼠标点击mathtype&#xff0c;再点击内联 ② 出现以下…

C++学习记录

C学习 1.const,mutable,初始化列表,this指针2.static使用类友元作用友元全局函数友元类友元成员函数 运算符重载左移运算符 <<下标运算符赋值运算符括号运算符一元运算符 自动类型转换隐式类型转换 转换函数 继承继承方式构造函数继承名字遮蔽和类作用域名字覆盖类作用域…

大气能见度测量仪的功能优势:安心守护

大气能见度是衡量空气质量与交通安全的重要指标之一&#xff0c;它直接关系到人们的出行安全、航空航行的顺畅以及环境监测的准确性。为此&#xff0c;大气能见度测量仪应运而生&#xff0c;以其独特的功能优势&#xff0c;成为现代气象观测与交通管理中不可或缺的高科技设备。…

数据资源:机遇与挑战并存的新时代

数据资源&#xff1a;机遇与挑战并存的新时代 2023年全国数据生产总量达到32.85泽字节&#xff08;ZB&#xff09;&#xff0c;同比增长22.44%&#xff0c;数据生产规模持续扩大&#xff0c;其中非结构数据增长尤为突出&#xff0c;这得益于5G、AI技术的发展和智能设备的应用。…

ME31K-创建合同

ME31K创建合同 合同分为&#xff1a;数量合同和价值合同 CMK代表数量合同。CWK代表价值合同。 输入对应数量或价值后&#xff0c;点击保存。 点击保存后。系统会带出一个合同号。 可以引用这个合同号&#xff0c;去创建采购订单或者计划协议。

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

创建VSOA的server端 创建工程 参考 hellovsoa 工程&#xff0c;创建 server 工程&#xff0c;工程源码修改如下&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h> #include <netinet/in.h> #include <arpa/inet.h> #…

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;然后根据转发规则&…