在Mono上运行的C#中获取FQDN

时间:2013-06-14 17:56:21

标签: macos xamarin mono xamarin.mac

我正在使用Xamarin.mac。我需要获取本地计算机的完全限定域名。在Windows上,此代码有效:

public string GetFQDN()
{
  string domainName = System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName;
  string hostName = Dns.GetHostName();
  string fqdn = "";
  if (!hostName.Contains(domainName))
    fqdn = hostName + "." + domainName;
  else
    fqdn = hostName;

  return fqdn;
}

在Mac上,此代码会导致此错误: System.NotSupportedException: This platform is not supported

那么,Xamarin.mac中的等价物是什么?或者只是在Mono?

获取计算机名称将是一个良好的开端。

1 个答案:

答案 0 :(得分:3)

要做到这一点,你几乎可以在UNIX系统上用C做同样的事情,即用gethostname()检索主机名,然后使用DNS查找来查找规范网络名称主人。幸运的是,System.Net已经为此做了现成的调用。以下代码应该适用于OS X和Linux(实际上,在Linux上它或多或少是hostname --fqdn所做的):

using System;
using System.Net;

class Program {
  static void Main() {
    // Step 1: Get the host name
    var hostname = Dns.GetHostName();
    // Step 2: Perform a DNS lookup.
    // Note that the lookup is not guaranteed to succeed, especially
    // if the system is misconfigured. On the other hand, if that
    // happens, you probably can't connect to the host by name, anyway.
    var hostinfo = Dns.GetHostEntry(hostname);
    // Step 3: Retrieve the canonical name.
    var fqdn = hostinfo.HostName;
    Console.WriteLine("FQDN: {0}", fqdn);
  }
}

请注意,如果DNS配置错误,DNS查找可能会失败,或者您可能会获得相当无用的“localhost.localdomain”。

如果您希望模拟原始方法,可以使用以下代码检索域名:

var domainname = new StringBuilder(256);
Mono.Unix.Native.Syscall.getdomainname(domainname,
  (ulong) domainname.Capacity - 1);

为此,您需要将Mono.Posix程序集添加到构建中。