tcp服务提供者(c++)

概述

    此示例演示如何使用cpp_sdk编写tcp服务提供程序,cpp_sdk提供简单易用的接口给客户调用,与服务端通信/响应通告等细节sdk内部都完现了,用户无需花时间在这些细节上,而是专注于自身业务逻辑。

示例源文件cpp_sdk/sample_prvd.cpp
编译命令g++ -Wall -g -std=c++11 sample_conf.cpp -o sample_prvd ../common/libhocomm.so libsdk_cppcloud.so 或者 make sample_prvd
示例准备:先运行服务端cppcloud_serv,记下ip地址和端口。

示例代码

    如下给出的是关键语句伪代码。

#include "client_c.hpp" // sdk主头文件

int main( int argc, char* argv[] )
{
    // sdk初始化,传入自身服务名和所要连接的serv地址;
    int ret = client_c::Init("TestPrvd", "localhost:4800");

    // tcp服务初始化,传入要监听的端口
    if ( (ret = client_c::InitTcpProvider(listenPort)) )
    {
        printf("InitTcpProvider fail %d\n", ret);
        return -3;
    }

    // 设置服务到达的处理函数,一有请求到达就触发调用
    client_c::AddProvdFunction(TcpProviderHandle);

    // 向Serv注册此服务提供者信息,注册后默认不启动,下面的语句设置启用
    ret = client_c::RegProvider(appName, 1, 1, listenPort));
    // 启用服务;
    client_c::PostEnable(appName, 1, true);

    // sdk运行时以当前线程的方式,此处阻塞,直至被通知exit
    ret = client_c::Run(false);
    client_c::Destroy(); // 释放资源,和Init()对应。
    return 0;
}

// 服务提供处理
int TcpProviderHandle( msg_prop_t* msgprop, const char* body )
{
    printf("Provider| msg=%s\n", body);
    // do the job yourself here

    // 拼装回复的消费echo,调用ProvdSendMsgAsync发出回复。
    string echo = string("{\"code\": 0, \"desc\": \"sample provider handle\", \"echo_data\": ") + body + "}";
    client_c::ProvdSendMsgAsync(msgprop, echo);

    client_c::AddProviderStat(appName, 1, true);
    return 0;
}

注意

    源代码sample_prvd.cpp里消息处理里有个线程使用,伪代码未加上,总体流程不影响;加入多个线程是为了演示有些耗时的业务场景,可以异步响应消息,实现流水线式处理。    

启动运行

docker方式:

docker exec -it <container> sample_prvd [servip:port]
必须已启动了CppCloudo容器,是容器id或name,最后的[servip:port]不写默认连接localhost:4800;

另外注意,docker里启动的服务提供者端口是否与宿主机作了映射。

手动方式:

前提是c++ sdk库(libsdk_cppcloud.so libhocomm.so)已正常编译过了
cd cpp_sdk;
make sample_prvd;
./sample_prvd localhost:4800

演示结果

程序启动 prvd_png

服务处理,要结果调用者(消费者)才看得到结果 prvd2_png