TNonblockingServer en thrift se bloquea cuando se abre TFramedTransport

He estado intentando implementar un servidor de ahorro en C ++ para comunicarme con un cliente de Python.

Aquí está mi código:

Servidor de C ++:

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

Código de Python Client:

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

Cuando inicio el servidor y luego el cliente, obtengo lo siguiente:

    En el lado del cliente (Python):

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

    En el lado del servidor (c ++):

     assertion " 0 " failed 0 0x00007ffff0942425 in __GI_raise (sig=) 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=, assertion=0x7ffff1438f1a "0", file=0x7ffff1439298 "src/server/TNonblockingServer.cpp", line=, function=) 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 

    Estoy usando libthrift 0.8.0 y tengo el mismo pb con libthrift 0.9.1

    Funciona perfectamente cuando se utiliza un TSimpleServer en C ++ y un TBufferedTransport en el lado del cliente

    Lo sentimos, no he visto antes, pero parece ser el mismo problema: Multiplexación de servicios usando Apache Thrift

    En resumen, tienes que usar ambos enmarcados en ambos lados, o ninguno.

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