如何获取正在运行的TcpListener的fqdn

时间:2013-11-17 14:09:30

标签: c# tcplistener

我有一个由TcpListener表示的服务器,我需要它的FQDN。 有没有办法可以得到它? 监听器定义为:

TcpListener tcpListener = new TcpListener(IPAddress.Any, 27015);

1 个答案:

答案 0 :(得分:0)

我的简短回答是构建FQDN的简单方法。如果您的服务器实现多个网络接口,则可能会失败。

public string FQDN() {
  string host = System.Net.Dns.GetHostName();
  string domain = System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName;      

  return host + "." + domain;
}

<小时/> 由于您使用TCPListener初始化IPAddress.Any,因此根据MSDN

  

底层服务提供商将分配最合适的网络地址。

这意味着,您必须等到客户端连接才能检索FQDN,因为您事先不知道将分配哪个网络地址(如果您的服务器实现了多个网络接口,则不会知道客户将连接到哪一个。) 需要三个步骤来获取客户端连接到的网络接口的FQDN:

  1. 获取客户端的本地端点(作为IPEndPoint
  2. 获取端点的IP地址
  3. 获取此IP地址的主机条目(通过Dns.GetHostEntry
  4. 在代码中它看起来像这样:

    //using System.Net
    //using System.Net.Sockets
    
    TcpListener tcpListener = new TcpListener(IPAddress.Any, 27015);
    tcpListener.Start();
    
    //code to wait for a client to connect, omitted for simplicity
    
    TcpClient connectedClient = tcpListener.AcceptTcpClient(); 
    
    //#1: retrieve the local endpoint of the client (on the server)
    IPEndPoint clientEndPoint = (IPEndPoint)connectedClient.Client.LocalEndPoint;
    
    //#2: get the ip-address of the endpoint (and cast it to string)
    string connectedToAddress = clientEndPoint.Address.ToString();
    
    //#3: retrieve the host entry from the dns for the ip address
    IPHostEntry hostEntry = Dns.GetHostEntry(connectedToAddress);
    
    //print the fqdn
    Console.WriteLine("FQDN: " + hostEntry.HostName);
    

    您可以在一行中写出#1,#2和#3:

    Dns.GetHostEntry(((IPEndPoint)connectedClient.Client.LocalEndPoint).Address.ToString()).HostName);