2016-10-19 2 views
0

Я пытаюсь установить связь между 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) 

Похоже, эти трубы имеют те же основные параметры. Что мне не хватает?

ответ

0

Ну, я решил свою проблему по-другому. Я просто изменил логику клиента/сервера!

Я создал сервер каналов в Python и использовал QLocalSocket на конце Qt для отправки и получения сообщений в качестве клиента канала. Для меня все работало прямо из ворот. Недостатком было писать намного больше кода.

В моем случае использования на самом деле это имеет большее значение, но первый способ потребовал бы доли строк для реализации (по крайней мере, в Python, это примерно то же самое в Qt). Обратите внимание, что моя сторона Python включала код кода создания, который был опубликован в моем вопросе, в качестве образца того, что работало сервером для моего клиента python, который не удался с Qt-сервером. Я не делал ничего особенного с QLocalSocket, свойства по умолчанию работали нормально.

Смежные вопросы