当前位置: 首页 > news >正文

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

创建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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • poetry配置镜像
  • 【秋招笔试】2024-08-03-科大讯飞秋招笔试题(算法岗)-三语言题解(CPP/Python/Java)
  • DREAMLLM: SYNERGISTIC MULTIMODALCOMPREHENSION AND CREATION
  • C语言基础题:吃冰棍(C语言版)
  • Android笔试面试题AI答之Activity常见考点
  • AI智能测评应用平台项目分享
  • 数值分析——埃尔米特(Hermit)插值
  • Apple在Swift中引入同态加密
  • Stable Diffusion 官方模型V1.5版本下载
  • LLM - 理解 主流大模型 LLM 使用 Decoder Only 架构 (8点)
  • 回顾前面刷过的算法(4)
  • HanLP和Jieba区别
  • 单元测试JUnit
  • eslint配置忽略目录和文件
  • 国内开源软件镜像站点参考
  • [deviceone开发]-do_Webview的基本示例
  • [笔记] php常见简单功能及函数
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • [译] 怎样写一个基础的编译器
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 2017-09-12 前端日报
  • Angularjs之国际化
  • input实现文字超出省略号功能
  • Java方法详解
  • SwizzleMethod 黑魔法
  • 给第三方使用接口的 URL 签名实现
  • 判断客户端类型,Android,iOS,PC
  • 源码安装memcached和php memcache扩展
  • nb
  • 数据库巡检项
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • #QT(QCharts绘制曲线)
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (二)pulsar安装在独立的docker中,python测试
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (十三)MipMap
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .NET简谈设计模式之(单件模式)
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • ::
  • @RequestBody的使用
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042
  • [ 数据结构 - C++]红黑树RBTree
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解
  • [8] CUDA之向量点乘和矩阵乘法
  • [acm算法学习] 后缀数组SA