c#中的Unix套接字

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#中的Unix套接字相关的知识,希望对你有一定的参考价值。

我正在尝试使用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套接字?

答案

我认为没有理由期望这可以在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/

以上是关于c#中的Unix套接字的主要内容,如果未能解决你的问题,请参考以下文章

如何给UNIX域Socket套接字抓包?

unix套接字中的异步和非阻塞有啥区别?

C++ UNIX 帮助 - 简单的 TCP 服务器套接字连接

带有 libevent/libev 的 C 或 C++:监视 unix 套接字

一起talk C栗子吧(第一百五十七回:C语言实例--基于AF_UNIX域的数据报套接字通信)

是否可以使用 Unix 套接字在 C 应用程序和 Java 应用程序之间创建通信?