c# - Linux 上的 .NET Core 命名管道问题(地址已被使用)

标签 c# .net .net-core

我正在研究使用命名管道来控制在 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在添加斜杠之前检查 IsInAppContainerIsInAppContainer的代码显示,如果不是 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/

相关文章:

c# - 从 ApplicationContext 退出应用程序

c# - 使用 Windows 兼容包创建 .net 核心 Windows 服务

c# - 如何使用 Linq 获得最高值(value)

c# - 有谁知道Dokan虚拟文件系统驱动程序是否支持文件/文件夹权限?

c# - WCF 发送大文件

.net - 在 .NET 中调试依赖注入(inject)

c# - .NET Core 2.2下System.Drawing中找不到Image类

c# - 在 Startup 中将 ApplicationDbContext 注入(inject)到 Configure 方法中

c# - ComboBox 绑定(bind)到枚举类型的值,同时还具有 "blank"条目?

c# - 如何解决此 WIF/WCF 异常?