背景:我有许多小型c ++程序都使用相同的静态库。我现在将thrift实现为中间层,这样我就可以在静态库的不同计算机上运行小型c ++程序。我不能改变c ++程序,所以我正在创建一个看起来像原始的“假”静态库,但实际上是一个调用真实静态库的thrift客户端。
问题:如何创建静态库,以便c ++程序在打开库时自动打开套接字,并在程序退出时关闭套接字?
通常,thrift客户端使用main方法在开头打开套接字并在最后关闭它。我可以让库在每个方法调用之前检查套接字是否打开,但我不知道如何关闭套接字。将它打开是否有任何问题?
答案 0 :(得分:1)
一种方法可能是使用单个本地静态实例在库中创建C ++类。由于实例将在第一次调用时构造并在卸载时被销毁,因此您可以使用构造函数/析构函数进行连接和断开连接,如下所示:
#include <boost/shared_ptr.hpp>
#include <thrift/transport/TSocket.h>
#include <thrift/protocol/TBinaryProtocol.h>
#include "gen-cpp/mySvc.h"
using namespace apache::thrift::transport;
using namespace apache::thrift::protocol;
class ThriftProxy {
public:
ThriftProxy() :
trans(new TSocket("myhost", 8585)),
proto(new TBinaryProtocol(trans)),
client_(proto)
{
trans->open();
}
~ThriftProxy()
{
trans->close();
}
static mySvcClient & client()
{
static ThriftProxy proxy;
return proxy.client_;
}
private:
boost::shared_ptr<TSocket> trans;
boost::shared_ptr<TProtocol> proto;
mySvcClient client_;
};
然后lib中的函数可以使用ThriftProxy :: client()方法调用Apache Thrift服务器:
int exportedFunc(int i) {
return ThriftProxy::client().myRPCFunc(i);
}
注意:在大多数情况下,将TBufferedTransport或TFramedTransport添加到I / O堆栈是减少对网络的小写入的好主意。留在这里以保持示例简单。