diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 18:45:59 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 18:45:59 +0000 |
commit | 19fcec84d8d7d21e796c7624e521b60d28ee21ed (patch) | |
tree | 42d26aa27d1e3f7c0b8bd3fd14e7d7082f5008dc /src/jaegertracing/thrift/contrib/transport-sample/server/server.cpp | |
parent | Initial commit. (diff) | |
download | ceph-upstream.tar.xz ceph-upstream.zip |
Adding upstream version 16.2.11+ds.upstream/16.2.11+dsupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/jaegertracing/thrift/contrib/transport-sample/server/server.cpp')
-rw-r--r-- | src/jaegertracing/thrift/contrib/transport-sample/server/server.cpp | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/src/jaegertracing/thrift/contrib/transport-sample/server/server.cpp b/src/jaegertracing/thrift/contrib/transport-sample/server/server.cpp new file mode 100644 index 000000000..dba8368b7 --- /dev/null +++ b/src/jaegertracing/thrift/contrib/transport-sample/server/server.cpp @@ -0,0 +1,168 @@ +// server.cpp : Defines the entry point for the console application. +// +// sample server command line app using Thrift IPC. +// +// This is a simple demonstration of full duplex RPC. That is, each +// side runs both a client and server to enable bidirectional event +// signaling. +// + +#ifdef _WIN32 +# include "stdafx.h" +#else +# include "config.h" +#endif + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +//Include this before the generated includes +#include "ThriftCommon.h" +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +//Tailor these to your generated files +#include "../gen-cpp/SampleService.h" +#include "../gen-cpp/SampleCallback.h" + +using namespace Sample; //declared in .thrift file +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +int16_t ClientPort_; +std::string ClientPipeName_; +void S2CThreadProc(); + +//----------------------------------------------------------------------------- +// RPC implementations +// +class SampleServiceHandler : virtual public SampleServiceIf { + public: + SampleServiceHandler() { + // Your initialization goes here + } + + void HelloThere(std::string& _return, const std::string& HelloString) { + // Your implementation goes here + printf("<<<HelloThere() received string: %s\n", HelloString.c_str()); + _return = "Good thank you."; + } + + void ServerDoSomething() { + // Your implementation goes here + printf("ServerDoSomething(): Simulating work for 5 seconds\n"); + Sleep(5000); + printf("ServerDoSomething(): Done\n"); + } + + void ClientSideListenPort(const int16_t ClientListenPort) + { + ClientPort_ = ClientListenPort; + ClientPipeName_ = ""; +#ifdef _WIN32 + printf(">>>Connecting to client on port %d\n", ClientPort_); + boost::thread Connect2ClientThread(S2CThreadProc); +#endif + } + + void ClientSidePipeName(const std::string& ClientPipeName) + { + ClientPipeName_ = ClientPipeName; + ClientPort_ = 0; +#ifdef _WIN32 + printf(">>>Connecting to client pipe %s\n", ClientPipeName_.c_str()); + boost::thread Connect2ClientThread(S2CThreadProc); +#endif + } +}; +//----------------------------------------------------------------------------- + +#ifdef _WIN32 +int _tmain(int argc, _TCHAR* argv[]) +#else +int main(int argc, char **argv) +#endif +{ + int port; + std::string pipename; //e.g. "affpipe" + + bool usage = false; + + //Process command line params + if(argc > 1) + { + if(_tcscmp(argv[1], TEXT("-sp")) == 0) + { //Socket Port specified + port = _tstoi(argv[2]); +#ifdef _WIN32 + TWinsockSingleton::create(); +#endif + // Start the thrift server which is a blocking call. + thriftcommon::RunThriftServer<SampleServiceHandler, SampleServiceProcessor>(10, port); + } + else if(_tcscmp(argv[1], TEXT("-np")) == 0) + { //Named Pipe specified +#ifdef _WIN32 + std::wstring wpipe(argv[2]); + pipename.resize(wpipe.length()); + std::copy(wpipe.begin(), wpipe.end(), pipename.begin()); +#else + pipename = argv[2]; +#endif + printf("Using Named Pipe %s\n", pipename.c_str()); + + //Thrift over Named Pipe. + thriftcommon::RunThriftServer<SampleServiceHandler, SampleServiceProcessor>(10, pipename); + } + else if(_tcscmp(argv[1], TEXT("-ap")) == 0) + { //Anonymous Pipe specified + //This is more involved because the child needs to be launched + //after the transport is created but before the blocking server + //call. +#ifdef _WIN32 + boost::shared_ptr<TServerTransport> transport(new TPipeServer()); //Anonymous pipe + thriftcommon::LaunchAnonPipeChild(".\\client.exe", transport); + boost::shared_ptr<SampleServiceHandler> handler(new SampleServiceHandler()); + thriftcommon::RunThriftServer<SampleServiceHandler, SampleServiceProcessor>(handler, 10, transport); +#else + printf("Anonymous pipes not (yet) supported under *NIX\n"); +#endif + } + else + usage = true; + } + else + usage = true; + + if(usage) + { + printf("Thrift sample server usage:\n\n"); + printf("Socket Port : -sp <port#>\n"); + printf("Named Pipe : -np <pipename> (e.g. affpipe)\n"); + printf("Anonymous Pipe: -ap\n"); + } + return 0; +} + + +//Thread Routine that connects to the 'client'. +void S2CThreadProc() +{ + //Master server's connection to client-side's server. + boost::shared_ptr<SampleCallbackClient> clientsrv; //Client class from Thrift-generated code. + boost::shared_ptr<TTransport> transport; + if(ClientPort_ != 0) + thriftcommon::ConnectToServer<SampleCallbackClient, TTransport>(clientsrv, transport, ClientPort_); + if(!ClientPipeName_.empty()) + thriftcommon::ConnectToServer<SampleCallbackClient, TTransport>(clientsrv, transport, ClientPipeName_); + + try { + transport->open(); + + clientsrv->pingclient(); + Sleep(1500); + clientsrv->pingclient(); + Sleep(1500); + clientsrv->pingclient(); + + transport->close(); + } catch (TException &tx) { + printf("ERROR: %s\n", tx.what()); + } +} + |