所以我似乎对这个问题有类似的问题: Named pipes performance issues
我从C#发送没有问题 - >德尔福。但德尔福必须发送给我的那一刻,整个世界都结束了,我不明白为什么。除非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中获得一个Byte。
////////////////////////////////////////////////////////////////////////////////
// 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);
对于我的生活,我似乎无法理解我哪里出错了。
EDIT2:
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
答案 0 :(得分:2)
所以我把一切都搞定了,这里有一些与Libby的Pipes.PAS接口的课程:
while(true) { if(pipeClient.CanRead) { byte[] buffer = new byte[BUFFER_SIZE]; int bytesRead = pipeClient.Read(buffer, 0, BUFFER_SIZE); if(bytesRead > 0) ... Do stuff } }
多块开始包:
* 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)
//中间的一切都是你保存的东西
多块结束包:
* 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点,我还没有睡觉,所以我不确定我遗漏了什么。