gpt4 book ai didi

c# - Delphi Pipes.PAS 与 .NET 命名管道不兼容?

转载 作者:行者123 更新时间:2023-11-30 17:03:29 24 4
gpt4 key购买 nike

所以我似乎遇到了与这个问题类似的问题: Named pipes performance issues

我从 C# -> Delphi 发送没有问题。但是当 Delphi 必须发送给我时,整个世界就结束了,我不知道为什么。除非 Delphi 客户端断开连接,否则所有读取操作将永远阻塞。 :-(

        var stream = new NamedPipeClientStream(".",
PipeName,
PipeDirection.InOut,
PipeOptions.Asynchronous);
stream.Connect();
stream.ReadMode = PipeTransmissionMode.Message; // Have tried Byte

Pipe.InBufferSize 始终为 0。Delphi 从来没有通过任何东西。当我尝试 Pipe.Read() 它卡住/阻塞直到 ResurrectionOfChrist == true。

我有一个线程调用:

    protected static byte[] ReadMessage(PipeStream stream)
{
MemoryStream memoryStream = new MemoryStream();

byte[] buffer = new byte[BUFFER_SIZE];

do
{
stream.Read(buffer, 0, BUFFER_SIZE); // Freezes here (not the loop)
memoryStream.Write(buffer, 0, buffer.Length);
} while (stream.IsMessageComplete == false);

return memoryStream.ToArray();
}

想知道是否有人对这个 Libby 的 Pipes.PAS 和 .NET 有任何经验?

我知道 Libby 定义了以下内容......我不确定这是否是我需要实现的......问题是,我无法从该死的 Pipe 中获取单个字节。

////////////////////////////////////////////////////////////////////////////////
// Mutliblock message constants
////////////////////////////////////////////////////////////////////////////////
const
MB_MAGIC = $4347414D; // MAGC
MB_START = $424D5453; // STMB
MB_END = $424D5445; // ETMB
MB_PREFIX = 'PMM';

编辑:[根据要求的信息]所以我没有写入管道的源代码(我会尝试获取它),但我有从中读取的 Delphi 源代码(我正在尝试移植到 C# 的内容)

  if not Assigned(NamedPipe) then
begin
NamedPipe := TPipeClient.Create(nil);
NamedPipe.PipeName := 'MyProc_' + IntToStr(GetCurrentProcessId);
NamedPipe.OnPipeMessage := OnPipeMsg;
NamedPipe.Connect(5000);
end;

procedure OnPipeMsg(Sender : TObject; Pipe : HPIPE; Stream : TStream);
MyStream.CopyFrom(Stream);

对于我的生活,我似乎无法理解我哪里出错了。

编辑2:

Delphi Pipes Source being used is from :
http://francois-piette.blogspot.com/2013/04/inter-process-communication-using-pipes.html
located :
http://www.overbyte.be/frame_index.html?redirTo=/blog_source_code.html

最佳答案

所以我让一切正常,这里是与 Libby 的 Pipes.PAS 交互时的一些经验教训:

  1. NamedPipeClientStream.IsMessageComplete 永远不会为您工作。至少,它不适合我。
  2. 您的阅读线程/函数需要看起来像:
while(true)
{
if(pipeClient.CanRead)
{
byte[] buffer = new byte[BUFFER_SIZE];
int bytesRead = pipeClient.Read(buffer, 0, BUFFER_SIZE);
if(bytesRead > 0)
... Do stuff
}
}
  1. Libbys 使用自定义协议(protocol)来发送多 block 信号:

多 block 开始包:

* 0x10 0x00 0x00 0x00 (4 bytes for length ... decimal 16)
* 0x4d 0x41 0x47 0x43 (4 bytes for "MB_MAGIC" ... ASCII is "MAGC")
* 0x53 0x54 0x4d 0x42 (4 bytes for "MB_START" control ... ASCII is "STMB" for Start Multi-block)
* 0x4d 0x41 0x47 0x43 (4 bytes for "MB_MAGIC" again)

//中间的一切都是你保留的

多 block 结束数据包:

* 0x10 0x00 0x00 0x00 (4 bytes for length ... decimal 16)
* 0x4d 0x41 0x47 0x43 (4 bytes for "MB_MAGIC" ... ASCII is "MAGC")
* 0x45 0x54 0x4d 0x42 (4 bytes for "MB_END" control ... ASCII is "ETMB" for End Multi-block)
* 0x4d 0x41 0x47 0x43 (4 bytes for "MB_MAGIC" again)

哦,如果您想知道管道需要什么参数:

pipeClient = new NamedPipeClientStream(".", pipeName, PipeDirection.InOut, PipeOptions.Asynchronous, System.Security.Principal.TokenImpersonationLevel.Anonymous);

如果您有其他问题,请随时发表评论。现在是早上 7:00,我还没睡,所以我不确定自己遗漏了什么。

关于c# - Delphi Pipes.PAS 与 .NET 命名管道不兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18528626/

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