我正在研究使用命名管道来控制在 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
这是实现GetUniquePipeName:PipeTestBase.cs
以防万一,这是我正在使用的代码(一个班轮,非常简单):
_pipe = new NamedPipeServerStream("somepipename", PipeDirection.InOut,1);
Run Code Online (Sandbox Code Playgroud)
我做错了什么,或者命名管道还没有完全为 Linux 实现?
关于错误:
未处理的异常:System.PlatformNotSupportedException:此平台上的管道名称只能包含在文件名中有效的字符。
这是预期的行为。您的输入 ( /tmp/somepipename) 是完全限定的路径,而不是文件名。有效文件名的示例是:some.pipe
但是,在某些平台上使用命名管道时,正斜杠是有效的。这就是为什么您可以看到CoreFX 测试类IsInAppContainer在添加斜杠之前进行了检查。IsInAppContainer的代码显示,如果它不是 Windows,它将始终返回false而不添加斜杠。
我已经在 MacOS 10.12.6 和 CentOS 7.2 上通过命名管道测试了客户端服务器连接,它按预期工作。您实际上可以在 GitHub 上看到PipeStream 的一些Unix 特定实现。
我相信引发的错误:
地址已被使用
来自您的程序试图绑定到已在使用的 IP/端口组合。可能是这样吗?如果没有,请提供您的解决方案,以便我在 Linux 机器上对其进行故障排除。
| 归档时间: |
|
| 查看次数: |
4583 次 |
| 最近记录: |