ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c-TFramedTransport打开时,节俭的TNonblockingServer崩溃

2019-10-11 01:08:24  阅读:204  来源: 互联网

标签:python c multithreading thrift


我一直在尝试在C中实现一个节俭服务器以与Python客户端进行通信.

这是我的代码:

C服务器:

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客户端代码:

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

当我启动服务器然后启动客户端时,我得到以下信息:

在客户端(Python):

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

在服务器端(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

我正在使用libthrift 0.8.0,并且与libthrift 0.9.1具有相同的pb

当在C上使用TSimpleServer并在客户端上使用TBufferedTransport时,它可以完美地工作

解决方法:

抱歉,之前没有见过,但是看起来像是同一问题:
Service Multiplexing using Apache Thrift

简而言之,您必须使用两面都没有框的框架,也可以不使用.

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

标签:python,c,multithreading,thrift
来源: https://codeday.me/bug/20191010/1888818.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有