0

背景:同じ静的ライブラリを使用する小さな C++ プログラムが多数あります。静的ライブラリとは別のコンピューターで小さな C++ プログラムを実行できるように、thrift を中間層として実装しています。私は C++ プログラムを変更できないので、オリジナルのように見える「偽の」静的ライブラリを作成していますが、実際には本物の静的ライブラリを呼び出すリサイクル クライアントです。

問題: C++ プログラムがライブラリを開くときにソケットを自動的に開き、プログラムが終了するときにソケットを閉じるように、スタティック ライブラリを作成するにはどうすればよいですか??

通常、リサイクル クライアントは、最初にソケットを開き、最後にソケットを閉じる main メソッドを使用します。すべてのメソッド呼び出しの前にソケットが開いているかどうかをライブラリにチェックさせることができますが、ソケットを閉じる方法がわかりません。開けたままでも問題ありませんか?

4

1 に答える 1

1

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_;
};

ライブラリ内の関数は、ThriftProxy::client() メソッドを使用して Apache Thrift サーバーを呼び出すことができます。

int exportedFunc(int i) {
    return ThriftProxy::client().myRPCFunc(i);
}

メモ: ほとんどの場合、TBufferedTransport または TFramedTransport を I/O スタックに追加することは、ネットワークへの小さな書き込みを減らすために良い考えです。例を単純にするために、ここでは省略します。

于 2013-07-12T21:13:37.193 に答える