C# 中的 Unix 套接字

Unix sockets in c#

我正在尝试使用 Mono 的 UnixEndPoint,但还没开始使用就失败了。我是 运行 Xamarind + .net 4.5 在 64 位 windows 7 系统上。

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

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 套接字可能只是非常愚蠢

我看不出有任何理由期望它能在 Windows 上运行。

AddressFamily 值由 .NET 的 Socket class 直接传递给本机 WSASocket() 函数以创建非托管套接字对象。默认情况下,Windows只支持AddressFamily.InterNetworkAddressFamily.InterNetworkV6(分别对应AF_INETAF_INET6,除非你安装了其他网络提供商(NetBIOS将是一个明显的替代方案,可能在 Windows 安装中常见。

来自文档:

The values currently supported are AF_INET or AF_INET6, which are the Internet address family formats for IPv4 and IPv6. Other options for address family (AF_NETBIOS for use with NetBIOS, for example) are supported if a Windows Sockets service provider for the address family is installed.

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/