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 使用的描述符)。
当在 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 使用的描述符)。