Fdbus在同一网络不同PC下通讯方法

之前编译了fdbus后,需要测试下在不同pc下能否互通;因为没搞过这东西,所以在网上查了下,下面列举下具体步骤:

  • 架构如下:

  • 解释 :

        由于name server的地址是固定的,endpoint启动后,会自动连接到name server注册(server)或解析(client)名字。如果有多台主机,每台主机上运行自己的name server,负责各自的名字服务,那么这些主机就成了孤岛,无法通过svc://server_name这样的服务名称互相连接。当然client可以绕开name server,用实际地址直接连接上server,但这样无法灵活部署和组网。为了支持跨网络的名字解析,需要有一个服务来管理系统里所有主机,把主机信息同步给所有name server,进而这些name server之间可以建立连接,协同工作,共同完成全网范围内的名字服务。这个服务就是host server。

        host server的工作原理是:整个网络运行一个host server,可以位于任意一台大家都能访问的主机上。所有主机的name server都连接到host server,向它注册自己所在的主机。host server维护一张包含各主机ip地址的主机列表,并把该表同步给网络里所有的name server。name server根据该表与网络里所有主机上的name server建立连接。

        一旦所有主机上的name server都两两建立连接,就可以通过一套内部协议完成跨主机的服务名解析和服务上线通知。例如当一台主机上的client向本地name server请求解析服务名对应的地址,本地name server可以把该请求广播给所有相连的name server,在整个网络范围内查找服务。

 

 因此我们需要按照对应的架构启动对应程序

  • 具体操作
  • 我这里使用QNX开发板作为PC1,Linux系统为PC2

 PC1

启动host_server ./host_server &
启动name_server./name_server &
启动fdbServer./fdbServer

 

 PC2

启动name_server./name_server -n PC2 -u tcp://192.168.1.104:60000
启动fdbServer./fdbClient

 可以看到现在客户端已经连接上服务端

查看svc可以看到对应服务状态

 上述Client和Server是自己仿照fdbus-exmple写的用例;代码如下

client.h

#ifndef __CLIENT_H__
#define __CLIENT_H__

#include <fdbus/fdbus.h>
#include <fdbus/CFdbProtoMsgBuilder.h>

using namespace ipc::fdbus;
static CBaseWorker main_worker;

class Client : public CBaseClient {
public:
    Client(const char *name, CBaseWorker *work = nullptr);
    ~Client();
protected:
    void onOnline(const CFdbOnlineInfo &info);
    void onOffline(const CFdbOnlineInfo &info);
    void onBroadcast(CBaseJob::Ptr &msg_ref);
    void onInvoke(CBaseJob::Ptr &msg_ref);
};

#endif //__CLIENT_H__

client.cpp

#include "client.h"


Client::Client(const char *name, CBaseWorker *work)
    : CBaseClient(name, work) {
}

Client::~Client() {

}
void Client::onOnline(const CFdbOnlineInfo &info) {
    printf("client session online: %d, secure: %d\n", info.mSid, info.mQOS);   
}
void Client::onOffline(const CFdbOnlineInfo &info) {
    printf("client session shutdown: %d, secure: %d\n", info.mSid, info.mQOS);
}
void Client::onBroadcast(CBaseJob::Ptr &msg_ref) {
    printf("client onBroadcast\n");
}
void Client::onInvoke(CBaseJob::Ptr &msg_ref) {
    printf("client onInvoke\n");
}


int main() {
    printf("fdbus client start!\n");
    FDB_CONTEXT->start();
    fdbLogAppendLineEnd(true);
    FDB_CONTEXT->registerNsWatchdogListener([](const tNsWatchdogList &dropped_list)
        {
            for (auto it = dropped_list.begin(); it != dropped_list.end(); ++it)
            {
                printf("Error!!! Endpoint drops - name: %s, pid: %d\n", it->mClientName.c_str(), it->mPid);
            }
        });
    CBaseWorker *worker_ptr = &main_worker;
    worker_ptr->start();
    std::string server_name = "mjc";
    std::string url(FDB_URL_SVC);
    url += server_name;
    server_name += "_client";
    auto client = new Client(server_name.c_str(), worker_ptr);
    client->enableReconnect(true);
    client->enableUDP(true);
    int ret = client->connect(url.c_str());
    printf("client connect:%s,ret:%d\n",url.c_str(),ret);
    CBaseWorker background_worker;
    background_worker.start(FDB_WORKER_EXE_IN_PLACE);
}

 server.h

#ifndef __SERVER_H__
#define __SERVER_H__

#include <fdbus/fdbus.h>
#include <fdbus/CFdbProtoMsgBuilder.h>

using namespace ipc::fdbus;

static CBaseWorker main_worker;

class Server : public CBaseServer 
{
public:
    Server(const char *name, CBaseWorker *work = nullptr);
    ~Server();
protected:
    void onOnline(const CFdbOnlineInfo &info);
    void onOffline(const CFdbOnlineInfo &info);
    void onSubscribe(CBaseJob::Ptr &msg_ref);
    void onInvoke(CBaseJob::Ptr &msg_ref);
};


#endif //__SERVER_H__

server.cpp

#include "server.h"

Server::Server(const char *name, CBaseWorker *work)
    : CBaseServer(name, work) {
}

Server::~Server() {

}

void Server::onOnline(const CFdbOnlineInfo &info) {
    if(info.mFirstOrLast) {
        printf("First Client connected\n");
    }
}
void Server::onOffline(const CFdbOnlineInfo &info) {
    if(info.mFirstOrLast) {
        printf("server session shutdown: %d, secure: %d\n", info.mSid, info.mQOS);
    }
}

void Server::onSubscribe(CBaseJob::Ptr &msg_ref) {
    printf("Server onSubscribe\n");
}
void Server::onInvoke(CBaseJob::Ptr &msg_ref) {
    printf("Server onInvoke\n");
}

int main() {
    printf("fdbus server start\n");
    FDB_CONTEXT->start();
    CBaseWorker *worker_ptr = &main_worker;
    worker_ptr->start();

    std::string server_name = "mjc";
    std::string url(FDB_URL_SVC);
    url += server_name;
    server_name += "_server";
    auto server = new Server(server_name.c_str(), worker_ptr);
    server->enableWatchdog(true);
    server->enableUDP(true);
    server->setExportableLevel(FDB_EXPORTABLE_SITE);
    // server->setExportableLevel(FDB_EXPORTABLE_DOMAIN);
    server->bind(url.c_str());
    printf("server bind:%s\n",url.c_str());

    CBaseWorker background_worker;
    background_worker.start(FDB_WORKER_EXE_IN_PLACE);
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.0)

project(fdbDemo)

option(COMPILE_PLATFORM_QNX "compile platform is qnx" ON)

if(COMPILE_PLATFORM_QNX)
    SET(CMAKE_CXX_COMPILER aarch64-unknown-nto-qnx7.0.0-g++)
    SET(CMAKE_C_COMPILER aarch64-unknown-nto-qnx7.0.0-gcc)

    include_directories(${CMAKE_CURRENT_SOURCE_DIR}/thirdpart/fdbus-qnx/include
                        ${CMAKE_CURRENT_SOURCE_DIR}/thirdpart/protobuf-qnx/include)
 
    aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/fdbusclient FDBCLIENT)
    aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/fdbusserver FDBSERVER)
 
    LINK_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/thirdpart/fdbus-qnx/lib
                     ${CMAKE_CURRENT_SOURCE_DIR}/thirdpart/protobuf-qnx/lib)
    set(LIB_LIST protobuf fdbus)
else()
    include_directories(${CMAKE_CURRENT_SOURCE_DIR}/thirdpart/fdbus-linux/include
                        ${CMAKE_CURRENT_SOURCE_DIR}/thirdpart/protobuf-linux/include)
    
    aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/fdbusclient FDBCLIENT)
    aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/fdbusserver FDBSERVER)
    
    LINK_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/thirdpart/fdbus-linux/lib
                    ${CMAKE_CURRENT_SOURCE_DIR}/thirdpart/protobuf-linux/lib)
    
    set(LIB_LIST protobuf fdbus pthread)
endif()

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -Wall -std=c++11")
 
ADD_EXECUTABLE(fdbServer ${FDBSERVER})
TARGET_LINK_LIBRARIES(fdbServer ${LIB_LIST})
 
ADD_EXECUTABLE(fdbClient ${FDBCLIENT})
TARGET_LINK_LIBRARIES(fdbClient ${LIB_LIST})

message(${CMAKE_SYSTEM_NAME})

默认打开了QNX宏,需要编译linux的版本关掉即可

  • 文件目录结构如下:(tree下载不下来,先这么看吧)

参考文档:

Docker Image for FDBus - 灰信网(软件开发博客聚合) (freesion.com)icon-default.png?t=M85Bhttps://www.freesion.com/article/9824284277/Fast Distributed Bus - FDBus:高速分布式总线以及中间件开发框架_jeremy_cz的博客-CSDN博客icon-default.png?t=M85Bhttps://blog.csdn.net/jeremy_cz/article/details/89060291

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值