如何获得客户端IP地址与C ++在thrift [英] How to get client IP Address with C++ in thrift

查看:2083
本文介绍了如何获得客户端IP地址与C ++在thrift的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我现在在C ++中实现基于节点的(0.4.0)服务,遇到一个问题:



有一种方法可以获得客户端的IP地址从一个服务方法实现?

解决方案


$ b <在TNonblockingServer中,当TProcessor :: process()被调用时,TProtocol.transport是一个TMemoryBuffer,所以客户端ip地址是不可能的。



但是我们可以扩展类TServerEventHandler,当客户端要调用处理器时,调用方法TServerEventHandler :: processContext()。

  static boost :: thread_specific_ptr< std :: string> thrift_client_ip; //线程特定
类MyServerEventHandler:public TServerEventHandler
{
virtual void processContext(void * serverContext,boost :: shared_ptr< TTransport> transport)
{
TSocket * sock = static_cast< TSocket *>(transport.get());

if(sock)
{
//thrift_client_ip.reset(new string(sock-> getPeerAddress())); // 0.9.2,重用TNonblockingServer :: TConnection返回脏地址,参见https://issues.apache.org/jira/browse/THRIFT-3270
sock-> getCachedAddress(); // use this api instead
}
}
};

//创建非阻塞服务器
TNonblockingServer服务器(processor,protocolFactory,port,threadManager);
boost :: shared_ptr< MyServerEventHandler> eventHandler(new MyServerEventHandler());
server.setServerEventHandler(eventHandler);


I am implementing a thrift-based (0.4.0) service in C++ at the moment and encountered a question:

Is there a way to get the client's IP address from inside a service method implementation? I am using a TNonblockingServer.

Thanks in advance!

解决方案

In TNonblockingServer, When TProcessor::process() is called the TProtocol.transport is a TMemoryBuffer, so aquiring client ip address is impossible.

But We can extend class TServerEventHandler, method TServerEventHandler::processContext() is called when a client is about to call the processor.

static boost::thread_specific_ptr<std::string> thrift_client_ip; // thread specific
class MyServerEventHandler : public TServerEventHandler
{
    virtual void processContext(void* serverContext, boost::shared_ptr<TTransport> transport)
    {
        TSocket *sock = static_cast<TSocket *>(transport.get());

        if (sock)
        {
            //thrift_client_ip.reset(new string(sock->getPeerAddress())); // 0.9.2, reused TNonblockingServer::TConnection return dirty address, see https://issues.apache.org/jira/browse/THRIFT-3270
            sock->getCachedAddress(); // use this api instead
        }
    }
};

// create nonblocking server
TNonblockingServer server(processor, protocolFactory, port, threadManager);
boost::shared_ptr<MyServerEventHandler> eventHandler(new MyServerEventHandler());
server.setServerEventHandler(eventHandler);

这篇关于如何获得客户端IP地址与C ++在thrift的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆