【从零开始一步步学习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
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ScilogyHunter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值