Linux 上的 .NET Core 命名管道问题(地址已在使用)

Dan*_*Dan 5 .net c# .net-core

我正在研究使用命名管道来控制在 linux 下运行的 .net 核心应用程序的某些方面(例如:触发保存、关闭等)。

我正在尝试NamedPipeServerStream在应用程序内部创建一个,但是它总是失败并显示以下消息:(Address already in use我尝试了不同的名称,没有任何帮助)。

我还尝试使用创建临时管道/tmp/somepipename,但是这也失败并显示以下消息:The name of a pipe on this platform must only include characters valid in file names.

通过查看命名管道的 .NET Core 测试,这应该不是问题,因为它们也用于Path.GetTemporaryFileName()生成临时管道

这是用法:NamedPipeTestBase.cs

这是实现GetUniquePipeNamePipeTestBase.cs

以防万一,这是我正在使用的代码(一个班轮,非常简单):

_pipe = new NamedPipeServerStream("somepipename", PipeDirection.InOut,1);
Run Code Online (Sandbox Code Playgroud)

我做错了什么,或者命名管道还没有完全为 Linux 实现?

Bru*_*cia 8

关于错误:

未处理的异常:System.PlatformNotSupportedException:此平台上的管道名称只能包含在文件名中有效的字符。

这是预期的行为。您的输入 ( /tmp/somepipename) 是完全限定的路径,而不是文件名。有效文件名的示例是:some.pipe

但是,在某些平台上使用命名管道时,正斜杠是有效的。这就是为什么您可以看到CoreFX 测试类IsInAppContainer在添加斜杠之前进行了检查。IsInAppContainer的代码显示,如果它不是 Windows,它将始终返回false而不添加斜杠。

我已经在 MacOS 10.12.6 和 CentOS 7.2 上通过命名管道测试了客户端服务器连接,它按预期工作。您实际上可以在 GitHub 上看到PipeStream 的一些Unix 特定实现

我相信引发的错误:

地址已被使用

来自您的程序试图绑定到已在使用的 IP/端口组合。可能是这样吗?如果没有,请提供您的解决方案,以便我在 Linux 机器上对其进行故障排除。