Named Pipe and Anonymous Pipe transport for Windows
---------------------------------------------------

                 Key: THRIFT-1558
                 URL: https://issues.apache.org/jira/browse/THRIFT-1558
             Project: Thrift
          Issue Type: New Feature
          Components: C++ - Library
    Affects Versions: 0.9
         Environment: Microsoft Windows / Visual Studio
            Reporter: Peace C
         Attachments: Thrift_Named_Pipe_Transport_Windows.patch

This patch adds named & anonymous pipe transport for Windows. The new classes 
do not affect *NIX builds. We've been using this code on Windows & OSX for 6 
months and I'm fairly confident in it. It has not been hammered by automated 
tests and I welcome stress testing to wring out any bugs.

The TPipe and TPipeServer classes are generally modeled after TSocket and 
TSocketServer. The server of course uses TPipeServer to set up the server side 
then instantiates TPipe for communications. The client instantiates TPipe 
transport for connection to the server.

Here are some code snippet examples from functions we've built. Variables such 
as 'pipename' are passed in to the functions. Error handling has been omitted.

//-----------------------------------------------------------------------
// ---- Server ----
//-----------------------------------------------------------------------
#ifdef _WIN32
        pipename = "\\\\.\\pipe\\" + pipename;
        boost::shared_ptr<TServerTransport> transport(new TPipeServer(pipename, 
1024, NumThreads)); //Named pipe
#else  //Mac, *NIX
        unlink(pipename.c_str());
        boost::shared_ptr<TServerTransport> transport(new 
TServerSocket(pipename));
#endif

        boost::shared_ptr<TServer> server;
        boost::shared_ptr<MyHandler> handler(new MyHandler());
        boost::shared_ptr<TProcessor> processor(new MyProcessor(handler));
        boost::shared_ptr<TTransportFactory> tfactory(new 
TBufferedTransportFactory());
        boost::shared_ptr<TProtocolFactory> pfactory(new 
TBinaryProtocolFactory());

        if(NumThreads <= 1)
        {       //Single-threaded server
                server.reset(new TSimpleServer(processor, transport, tfactory, 
pfactory));
        }
        else
        {       //Multi-threaded server
                boost::shared_ptr<ThreadManager> threadManager = 
ThreadManager::newSimpleThreadManager(NumThreads);
                boost::shared_ptr<PlatformThreadFactory> threadFactory = 
boost::shared_ptr<PlatformThreadFactory>(new PlatformThreadFactory());
                threadManager->threadFactory(threadFactory);
                threadManager->start();
                server.reset(new TThreadPoolServer(processor, transport, 
tfactory, pfactory, threadManager));
        }

        printf("Starting the 'server'...\n");
        server->serve();
        printf("done.\n");


//-----------------------------------------------------------------------
// ---- Client ----
//-----------------------------------------------------------------------
#ifdef _WIN32
        pipename = "\\\\.\\pipe\\" + pipename;
        boost::shared_ptr<TTransport> pipe(new TPipe(pipename));
        transport.reset(new TBufferedTransport(pipe));
#else  //Mac, *nix
        boost::shared_ptr<TTransport> socket(new TSocket(pipename));
        transport.reset(new TBufferedTransport(socket));
#endif
        boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));

        client.reset(new MyClient(protocol));


--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to