名前付きパイプを使用して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)
それらのパイプが同じコアの設定を持っているように思えます。私は何が欠けていますか?