8

2つのプログラム(1つはPythonで、もう1つはC#で)間に双方向通信チャネルを作成しようとしています。

2つのC#プログラムまたは2つのPythonプログラムの間に名前付きパイプを作成すると、すべて問題ありませんが、(たとえば)PythonコードからC#サーバーに接続しようとすると、機能しません。

C#コード:

NamedPipeServerStream server = new NamedPipeServerStream(
    "Demo", PipeDirection.InOut, 100, PipeTransmissionMode.Byte,
    PipeOptions.None, 4096, 4096)

Pythonで使用する場合win32pipe、コードブロックをオンにしConnectNamedPipeます(決して戻りません)

p = win32pipe.CreateNamedPipe(
    r'\\.\pipe\Demo',
    win32pipe.PIPE_ACCESS_DUPLEX,
    win32pipe.PIPE_TYPE_BYTE | win32pipe.PIPE_WAIT,
    1, 65536, 65536,
    300,
    None)
win32pipe.ConnectNamedPipe(p)

open関数を使用すると、接続が確立されるだけですが、何も起こりません。

open( '\\\\.\\pipe\\Demo', 'r+b' )

ここで、Pythonプログラムを閉じると、C#サーバーはPythonからデータ項目を1つだけ受け取りSystem.IO.IOException、「パイプが壊れています」というメッセージが表示されます。

私は何か間違ったことをしていますか?

4

3 に答える 3

10

MSによると、ConnectNamedPipeは「接続を受け入れるためのサーバー側の機能」です。それが決して戻らない理由です-それはクライアントからの接続を待っています。サーバーとしてC#、クライアントとしてpythonを示すサンプルコードを次に示します。

C#:

using (var server = new NamedPipeServerStream("Demo"))
{
    server.WaitForConnection();

    using (var stream = new MemoryStream())
    using (var writer = new BinaryWriter(stream))
    {
        writer.Write("\"hello\"");
        server.Write(stream.ToArray(), 0, stream.ToArray().Length);
    }

    server.Disconnect();
}

Python:

import win32file
fileHandle = win32file.CreateFile(
    "\\\\.\\pipe\\Demo", 
    win32file.GENERIC_READ | win32file.GENERIC_WRITE, 
    0, 
    None, 
    win32file.OPEN_EXISTING, 
    0, 
    None)
left, data = win32file.ReadFile(fileHandle, 4096)
print(data)  # "hello"
于 2010-12-08T17:47:53.607 に答える
1

OK、問題を修正しました。バッファの0の位置を探す必要があります。

私のPythonコード:

    win32file.WriteFile(CLIENT_PIPE,"%d\r\n"%i ,None)
    win32file.FlushFileBuffers(CLIENT_PIPE)
    win32file.SetFilePointer(CLIENT_PIPE,0,win32file.FILE_BEGIN)
    i,s = win32file.ReadFile(CLIENT_PIPE,10,None)
于 2009-11-18T11:48:00.637 に答える
0

openではなくwin32pipe.popenを使用することを意図していると思います。

また、pipe.flush()、pipe.read()、およびtime.sleep(0.01)も試してください。IPCが同期するのに時間がかかる場合があります。

私は本当に知りません、それはサブプロセスパイプでの私の経験です。win32pipeは異なる場合があります。

于 2009-11-17T14:47:28.167 に答える