2016-10-19 18 views
0

名前付きパイプを使用してQt 5.4 C++とPython 2.7間で通信しようとしています。私は部分的に働いているが、私は遭遇しているいくつかの非互換性がある。 Qtの側で名前付きパイプ不明のエラー - Qt C++へのPython

、私は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の下にメッセージを送信しますこれは:

response = win32pipe.CallNamedPipe(pipeName, request, 512, 0) 

My Qt接続ハンドラが起動します。データが間違いなくパイプを下っています。しかし、ここでそれは崩れ落ちます。これは私がQtで得た出力です:

pipeConnected 
QLocalSocket::UnknownSocketError 
"" 

空の文字列は私がPythonから送信した私のランダムなテスト要求値を持つ必要があります。 Pythonの端部に

私はこの結果を取得:

response = win32pipe.CallNamedPipe(pipeName, request, 512, 0) 
pywintypes.error: (87, 'CallNamedPipe', 'The parameter is incorrect.') 

をIは、パイプの他方の側は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として定義されます。私はこのような他の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で作成し、QtエンドでQLocalSocketを使用してメッセージをパイプクライアントとして送受信しました。それはすべて私のためにゲートの外で働いた。欠点は、より多くのコードを書く必要があることでした。

私のユースケースでは、実際にはこのように意味がありますが、最初の方法では実装するのに必要な部分が少なくて済むでしょう(少なくともPythonではQtとほぼ同じです)。 Python側には、Qtサーバーで失敗したPythonクライアントのサーバーとして機能していたサンプルとして、質問に投稿したパイプコードの作成が含まれています。私はQLocalSocketで何も特別なことをしませんでした。デフォルトのプロパティは正常に動作しました。

関連する問題