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
演示结果
程序启动
服务处理,要结果调用者(消费者)才看得到结果