在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 )
这些管道似乎具有相同的核心设置。我错过了什么?在
我用另一种方式解决了我的问题。我只是颠倒了我的客户机/服务器逻辑!在
我用Python创建了一个管道服务器,并在Qt端使用QLocalSocket作为管道客户端发送和接收消息。这一切对我来说都很有效。缺点是必须编写更多的代码。在
在我的用例中,这种方式实际上更有意义,但是第一种方法需要花费很少的代码来实现(至少在Python中,在Qt中也差不多)。请注意,我的Python端包含了我在问题中发布的createpipe代码,作为一个示例,我的Python客户机在Qt服务器出现故障时,可以使用它作为服务器。我没有对QLocalSocket做任何特别的处理,它的默认属性工作得很好。在
相关问题 更多 >
编程相关推荐