我正在研究使用命名管道来控制在 Linux 下运行的 .net 核心应用程序的某些方面(例如:触发保存、关闭等)。
我正在尝试在应用程序中创建一个 NamedPipeServerStream
,但它总是失败并显示以下消息:Address already in use
(我尝试了不同的名称,没有任何帮助) .
我也曾尝试使用 /tmp/somepipename
创建一个临时管道,但是这也失败了,并显示以下消息:该平台上的管道名称必须仅包含有效字 rune 件名。
通过查看命名管道的 .NET Core 测试,这应该不是问题,因为它们还使用 Path.GetTemporaryFileName()
生成临时管道
这是用法:NamedPipeTestBase.cs
下面是 GetUniquePipeName
的实现:PipeTestBase.cs
以防万一,这是我使用的代码(一个衬里,非常简单):
_pipe = new NamedPipeServerStream("somepipename", PipeDirection.InOut,1);
是我做错了什么,还是命名管道尚未完全针对 Linux 实现?
最佳答案
关于错误:
Unhandled Exception: System.PlatformNotSupportedException: The name of a pipe on this platform must only include characters valid in file names.
This is the expected behavior .您的输入 (/tmp/somepipename
) 是完全限定的路径,而不是文件名。一个有效文件名的例子是:some.pipe
虽然在某些平台上使用命名管道时正斜杠是有效的。这就是为什么您可以看到 CoreFX test class在添加斜杠之前检查 IsInAppContainer
。 IsInAppContainer的代码显示,如果不是 Windows,它将始终返回 false
并且不添加斜线。
我已经在 MacOS 10.12.6 和 CentOS 7.2 上通过命名管道测试了客户端服务器连接,它按预期工作。你实际上可以看到一些Unix specific implementation of PipeStream on GitHub .
我相信引发的错误:
Address already in use
来自您的程序试图绑定(bind)到已在使用的 IP/端口组合。难道是这样吗? 如果不是,请提供您的解决方案,以便我可以在 Linux 机器上对其进行故障排除。
关于c# - Linux 上的 .NET Core 命名管道问题(地址已被使用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46683772/