c#中的Unix套接字

问题描述 投票:2回答:1

我正在尝试使用Mono的UnixEndPoint,但在使用它之前就失败了。我在64位Windows 7系统上运行Xamarind + .net 4.5。

这里有一些代码证明没有一个组合有效:

foreach(SocketType st in Enum.GetValues(typeof(SocketType)))
    foreach(ProtocolType pt in Enum.GetValues(typeof (ProtocolType)))
    {
        try{
            socket = new Socket (AddressFamily.Unix, st, pt);
            Console.WriteLine("{0} {1}", st, pt);
        }
        catch{

        }
    }

基本上,所有组合都会产生某种类型的套接字错误。

在这里,有人显然使用它 - mono, c#, sockets, performance - 这应该在Windows上工作吗?我可能只是非常愚蠢地尝试在WINDOWS上使用UNIX套接字?

c# windows sockets unix mono
1个回答
3
投票

我认为没有理由期望这可以在Windows上运行。

AddressFamily值直接由.NET的Socket类传递给本地WSASocket()函数,以创建非托管套接字对象。默认情况下,Windows仅支持AddressFamily.InterNetworkAddressFamily.InterNetworkV6(分别对应于AF_INETAF_INET6),除非您安装了其他网络提供程序(NetBIOS将是Windows安装中常见的明显替代方案)。

从文档:

当前支持的值是AF_INET或AF_INET6,它们是IPv4和IPv6的Internet地址系列格式。如果安装了地址系列的Windows套接字服务提供程序,则支持地址系列的其他选项(例如,与NetBIOS一起使用的AF_NETBIOS)。

有意义的是AddressFamily.Unix可以在Unix机器上运行,但除非你在Windows机器上安装了一个为该地址系列提供特定支持的提供程序,否则它应该在该Windows机器上失败。

注意:自2018年8月起,Windows对AF_UNIX套接字提供有限支持,以允许特定的Windows Subsystem for Linux方案。有一些重要的限制,其中包括:仅支持面向流的套接字;不支持辅助数据(例如用于传递文件信息或用户凭证)。给定套接字可用于在Windows内,WSL实例内或Windows与WSL实例之间进行通信,但不能用于多个这些方案。

目前,似乎桌面.NET版本和only limited support in .NET Core仍然没有支持。一旦UnixDomainSocketEndPoint支持在.NET Core中完成,我想它可能会重新回到桌面.NET版本。

有关更多详细信息,请参阅:https://devblogs.microsoft.com/commandline/af_unix-comes-to-windows/https://devblogs.microsoft.com/commandline/windowswsl-interop-with-af_unix/

© www.soinside.com 2019 - 2024. All rights reserved.