TNonblockingServer in thrift crashes when TFramedTransport opens

匿名 (未验证) 提交于 2019-12-03 02:31:01

问题:

I've been trying to implement a thrift server in C++ to communicate with a Python client.

here is my code:

C++ server:

shared_ptr<ThriftHandler> _handler (new myHandler()); shared_ptr<TProcessor> _processor (new myService(_handler)); shared_ptr<TProtocolFactory> _protocolFactory (new TBinaryProtocolFactory()); shared_ptr<ThreadManager> _threadManager = ThreadManager::newSimpleThreadManager(15); shared_ptr<PosixThreadFactory> _threadFactory(new PosixThreadFactory()); _threadManager->threadFactory(_threadFactory); _threadManager->start();  shared_ptr<TNonblockingServer> _server(new TNonblockingServer(_processor, _protocolFactory, 9090 ,_threadManager));; _server->serve(); 

Python Client code:

transport = TSocket.TSocket(host, port) transport = TTransport.TFramedTransport(transport) protocol = TBinaryProtocol.TBinaryProtocol(transport) client = MyService.Client(protocol) transport.open() log.info("connection success!") 

When I start the server and then the client, I get the following:

On the client side (Python):

./myPythonExec.py connection success! socket.error: [Errno 104] Connection reset by peer 

On the server side (c++):

assertion " 0 " failed 0  0x00007ffff0942425 in __GI_raise (sig=<optimized out>) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64 1  0x00007ffff0945b8b in __GI_abort () at abort.c:91 2  0x00007ffff093b0ee in __assert_fail_base (fmt=<optimized out>, assertion=0x7ffff1438f1a "0",  file=0x7ffff1439298 "src/server/TNonblockingServer.cpp", line=<optimized out>, function=<optimized out>) at assert.c:94 3  0x00007ffff093b192 in __GI___assert_fail (assertion=0x7ffff1438f1a "0", file=0x7ffff1439298 "src/server/TNonblockingServer.cpp",  line=558, function=0x7ffff1439c60 "void apache::thrift::server::TNonblockingServer::TConnection::workSocket()") at assert.c:103 4  0x00007ffff14336e4 in apache::thrift::server::TNonblockingServer::TConnection::workSocket (this=0x7fffc0004ac0) at src/server/TNonblockingServer.cpp:558 5  0x00007ffff11ed94c in event_base_loop () from /usr/lib/libevent-2.0.so.5 

I'm using libthrift 0.8.0 and have the same pb with libthrift 0.9.1

It works perfectly when using a TSimpleServer on C++ and a TBufferedTransport on the client side

回答1:

Sorry, have not seen earlier, but looks like the same issue: Service Multiplexing using Apache Thrift

In short, you have to use either framed on both sides, or none.

shared_ptr<TTransportFactory> _transportFactory(new TFramedTransportFactory()); shared_ptr<TNonblockingServer> _server(    new TNonblockingServer(      _processor,       _transportFactory,      _transportFactory,      _protocolFactory,       _protocolFactory,       9090,      _threadManager)); _server->serve(); 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!