我试图通过命名管道在Qt 5.4 C ++和Python 2.7之间进行通信。我有部分工作,但我遇到了一些不兼容的问题。
在Qt方面,我有一个QLocalServer对象:
QLocalServer *localServer_;
在实例化之后,我开始侦听管道并连接newConnection的信号/插槽
if( localServer_->listen( settings_.localMessagePipeName() ) )
connect( localServer_, SIGNAL( newConnection() ),
this, SLOT( newServerConnection() ), Qt::DirectConnection );
else
qDebug() << "server listen error!";
我的连接处理程序如下所示:
void newServerConnection()
{
qDebug() << "pipeConnected";
QLocalSocket *clientConnection = localServer_->nextPendingConnection();
connect( clientConnection, SIGNAL( disconnected() ),
clientConnection, SLOT( deleteLater() ) );
qDebug() << clientConnection->error();
qDebug() << clientConnection->readAll();
clientConnection->write( "TEST" );
clientConnection->flush();
clientConnection->disconnectFromServer();
}
在Python中,我在管道中发送一条消息:
response = win32pipe.CallNamedPipe( pipeName, request, 512, 0 )
我的Qt连接处理程序触发。数据绝对是下降的。但是,这就是崩溃的地方。这是我在Qt中得到的输出:
pipeConnected
QLocalSocket::UnknownSocketError
""
请注意,空字符串应具有我从Python发送的随机测试请求值。
在python结尾,我得到了这个结果:
response = win32pipe.CallNamedPipe( pipeName, request, 512, 0 )
pywintypes.error: (87, 'CallNamedPipe', 'The parameter is incorrect.')
我读了一个类似的线程,它说如果没有使用PIPE_TYPE_MESSAGE创建管道的另一端,就会产生python错误。在Qt中,它是。这似乎不是我的问题。检查QLocalServer的Qt源:https://github.com/radekp/qt/blob/master/src/network/socket/qlocalserver_win.cpp
listener.handle = CreateNamedPipe(
(const wchar_t *)fullServerName.utf16(), // pipe name
PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, // read/write access
PIPE_TYPE_MESSAGE | // message type pipe
PIPE_READMODE_MESSAGE | // message-read mode
PIPE_WAIT, // blocking mode
PIPE_UNLIMITED_INSTANCES, // max. instances
BUFSIZE, // output buffer size
BUFSIZE, // input buffer size
3000, // client time-out
NULL);
BUFSIZE定义为0 btw。
在Python中,当我在另一个Python类中创建管道时,我的测试客户端工作:
def __createPipe( self ):
pipeName = getPipeName( self._svc_name_ )
openMode = win32pipe.PIPE_ACCESS_DUPLEX | win32file.FILE_FLAG_OVERLAPPED
pipeMode = win32pipe.PIPE_TYPE_MESSAGE
nMaxInstances = win32pipe.PIPE_UNLIMITED_INSTANCES
nOutBufferSize = 0 # use default size
nInBufferSize = 0 # use default size
nDefaultTimeOut = (PIPE_TIMEOUT_SECONDS * 1000) # max time for pipe i/o
securityAttribs = pywintypes.SECURITY_ATTRIBUTES()
securityAttribs.SetSecurityDescriptorDacl( 1, None, 0 ) # full access
self.pipeHandle_ = win32pipe.CreateNamedPipe(
pipeName, openMode, pipeMode,
nMaxInstances, nOutBufferSize, nInBufferSize,
nDefaultTimeOut, securityAttribs )
似乎这些管道具有相同的核心设置。我错过了什么?
答案 0 :(得分:0)
好吧,我用另一种方式解决了我的问题。我只是颠倒了我的客户端/服务器逻辑!
我在Python中创建了一个管道服务器,并在Qt端使用QLocalSocket作为管道客户端发送和接收消息。这一切对我来说都是正确的。缺点是必须编写更多代码。
在我的用例中,它实际上更有意义,但是第一种方式只需要实现一小部分(至少在Python中,它在Qt中大致相同)。请注意,我的Python端包含了我在我的问题中发布的创建管道代码作为我的python客户端的服务器的示例,该客户端使用Qt服务器失败。我没有对QLocalSocket做任何特别的事情,它的默认属性运行正常。