gpt4 book ai didi

c# - C# 和 C 程序之间的命名管道通信失败

转载 作者:太空宇宙 更新时间:2023-11-04 03:34:36 26 4
gpt4 key购买 nike

大家。我的团队目前正在开发一个系统,该系统涉及两部分:C# 中的数据组织、UI 等,以及由于性能要求而在 C 中进行的大量运算。我们正试图挤压每一点性能,所以虽然最初我们使用文件来通信两个进程,但我们正在通过 IPC 来通信两个进程。特别命名的管道。传输C程序所需数据的C#程序的简化版本是这样的:

String pipeName = "some_random_name";
NamedPipeServerStream pipeServer = new NamedPipeServerStream(pipeName, PipeDirection.Out, 2, PipeTransmissionMode.Byte, PipeOptions.None, 0, 4096);
Process someProcess= new Process();
someProcess.StartInfo.FileName = appDirectory + "someProcess.exe";
someProcess.StartInfo.RedirectStandardInput = true;
someProcess.StartInfo.RedirectStandardOutput = true;
someProcess.StartInfo.RedirectStandardError = false;
someProcess.StartInfo.UseShellExecute = false;

someProcess.StartInfo.Arguments = "\\\\.\\pipe\\" + pipeName;
someProcess.Start();
someProcess.PriorityClass = ProcessPriorityClass.RealTime;

pipeServer.WaitForConnection();
pipeServer.Write(BitConverter.GetBytes(lengthOfNextDataSent), 0, 4);
pipeServer.WaitForPipeDrain();

for (i = 0; i < lengthOfNextDataSent; i++){
byte[] xBytes = BitConverter.GetBytes(SomeOtherIntegerData);
pipeServer.Write(xBytes , 0, xBytes.Length);
}

虽然简化的客户端 C 代码是:

fd = open(argv[1], O_RDONLY);
read(fd, &received_length, sizeof(int));
for(i = 0; i < received_length; i++){
read(fd, integer_array[i], 16);
}
close(fd);

奇怪的是,我能够正确接收(在 C 应用程序中)并解码多达 1820~ 字节。如果我尝试调用 C# 方法 WaitForPipeDrain 或尝试在写入 1820~ 字节后刷新(在较小的 block 中,整数大小或更大),将引发“管道已损坏”异常。如果我尝试写入比一次调用更多的字节,C 应用程序会在读取时崩溃。

编辑:我忘记提及的一个细节。我正在使用 mingw32-64 编译器在类似 cygwin 的环境(特别是 msys2)中编译 C 程序。

你能告诉我我做错了什么吗?

最佳答案

您忽略了 read 调用的返回值并假设整个缓冲区有效。

在管道上,你不能忽略这一点。

Raymond Chen 的博客上刚刚对此进行了讨论:Changing the conditions under which ReadFile produces fewer bytes than requested ,其中讨论了在 POSIX 下(严格来说,它不限制 Win32,但确实设定了 Win32 API 小心满足的期望)您的假设对普通本地文件有效,但对管道无效。

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

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