Я пытаюсь установить связь между Qt 5.4 C++ и Python 2.7 посредством именованного канала. Я частично работаю, но есть некоторая несовместимость, с которой я сталкиваюсь.Ошибка имени неизвестной трубы - Python to Qt C++
На стороне 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 я отправляю сообщение по трубе l ike:
response = win32pipe.CallNamedPipe(pipeName, request, 512, 0)
Мой обработчик подключения Qt срабатывает. Данные, безусловно, спускаются по трубе. Но вот где он разваливается. Это выход я получаю в Qt:
pipeConnected
QLocalSocket::UnknownSocketError
""
Обратите внимание, что пустая строка должна иметь мое случайное значение запроса тестирования я послал из Python.
В конце питона я получаю этот результат:
response = win32pipe.CallNamedPipe(pipeName, request, 512, 0)
pywintypes.error: (87, 'CallNamedPipe', 'The parameter is incorrect.')
Я прочитал подобный поток, который сказал, что ошибка питона получается, когда другая сторона трубы не создаются с PIPE_TYPE_MESSAGE. В Qt это правда. Кажется, это не моя проблема. Проверьте источник Qt для QLocalServer: 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 КСТАТИ.
В 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)
Похоже, эти трубы имеют те же основные параметры. Что мне не хватает?