gpt4 book ai didi

c# - C# 和 Python 之间的命名管道

转载 作者:可可西里 更新时间:2023-11-01 13:26:27 41 4
gpt4 key购买 nike

我正在尝试在两个程序(一个在 Python 中,另一个在 C# 中)之间创建双向通信 channel

当我在两个 C# 程序或两个 Python 程序之间创建命名管道时,一切正常,但是当我尝试(例如)从 Python 代码连接到 C# 服务器时,它不起作用:

C#代码:

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

如果我在 Python 中使用 win32pipeConnectNamedPipe 上的代码块(它永远不会返回)

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 接收一个数据项,并引发 System.IO.IOException 并显示“管道已损坏”消息

我做错了什么吗?

最佳答案

根据 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"

关于c# - C# 和 Python 之间的命名管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1749001/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com