命名管道未知错误Python到QtC++

2024-09-27 00:17:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过命名管道在Qt 5.4 C++和Python 2.7之间进行通信。我有它的部分工作,但有一些不兼容我遇到。在

在Qt端,我有一个QLocalServer对象:

QLocalServer *localServer_;

在实例化之后,我开始监听管道并连接信号/插槽以进行newConnection

^{pr2}$

我的连接处理程序如下所示:

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.')

我读过一个类似的线程,其中说python错误是在管道的另一端没有使用pipe_TYPE_消息创建的。不过,在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 )

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


Tags: selfmessagesize管道typeqtpipebufsize
1条回答
网友
1楼 · 发布于 2024-09-27 00:17:15

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

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

在我的用例中,这种方式实际上更有意义,但是第一种方法需要花费很少的代码来实现(至少在Python中,在Qt中也差不多)。请注意,我的Python端包含了我在问题中发布的createpipe代码,作为一个示例,我的Python客户机在Qt服务器出现故障时,可以使用它作为服务器。我没有对QLocalSocket做任何特别的处理,它的默认属性工作得很好。在

相关问题 更多 >

    热门问题