命名管道未知错误 - Python到Qt C ++

时间:2016-10-19 21:23:08

标签: python qt pipe

我试图通过命名管道在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 )

似乎这些管道具有相同的核心设置。我错过了什么?

1 个答案:

答案 0 :(得分:0)

好吧,我用另一种方式解决了我的问题。我只是颠倒了我的客户端/服务器逻辑!

我在Python中创建了一个管道服务器,并在Qt端使用QLocalSocket作为管道客户端发送和接收消息。这一切对我来说都是正确的。缺点是必须编写更多代码。

在我的用例中,它实际上更有意义,但是第一种方式只需要实现一小部分(至少在Python中,它在Qt中大致相同)。请注意,我的Python端包含了我在我的问题中发布的创建管道代码作为我的python客户端的服务器的示例,该客户端使用Qt服务器失败。我没有对QLocalSocket做任何特别的事情,它的默认属性运行正常。