mono 如何使用 BSD 套接字?

How does mono use BSD Sockets?

当在 Linux 上使用带有单声道的 System.Net.Sockets.Socket 时,大概单声道最终会使用 BSD 套接字(在 Windows 上使用 Winsock 套接字)。

查看 mono 的来源说 Socket.Bind() 它进行外部调用:

// Creates a new system socket, returning the handle
[MethodImplAttribute(MethodImplOptions.InternalCall)]
private extern static void Bind_internal(IntPtr sock,
                     SocketAddress sa,
                     out int error);

这对我来说意味着 mono 必须引用公开此类方法签名的本机库,并且本机库将负责跨平台实现(因为 BSD 上没有名为 Bind_internal 的函数或 Winsock 套接字)。

所以我现在的问题是单声道使用哪个本机库?

你有点误会,什么

[MethodImplAttribute(MethodImplOptions.InternalCall)]

意味着该方法的实现是在 Mono 实现中,而不是在运行时加载的程序集中。它可能会调用一个 OS 函数(对于套接字它肯定会:为什么要重新实现一个 OS 服务)。

但是它不必调用OS服务,从System.String的实现中的.NET Reference Source考虑这一点:

public extern int Length {
  [System.Security.SecuritySafeCritical]  // auto-generated
  [ResourceExposure(ResourceScope.None)]
  [MethodImplAttribute(MethodImplOptions.InternalCall)]
  get;
 }

String.Length 直接嵌入到 CLR 中,而不是 OS API.

总结:InternalCall 表示在运行时内本地实现。该实现可能会调用 OS 方法,也可能不会:您无法从这个级别判断。

回答你的问题:我希望 Mono 的 Bind_internal 最终会调用 bind(2) 但有一些包装(.NET Socket 比 *nix 文件有更多的状态和逻辑OS API 使用的描述符)。