2013-11-17 4 views
0

У меня есть сервер, представленный TcpListener, и мне нужно его полное доменное имя. Есть ли способ получить его? Слушатель определяется как:Как я могу получить fqdn запущенного TcpListener

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

, что в годовом исчислении означает «я есть сервер», так что ваш локальный? – K3rnel31

+0

вы можете получить IP-адрес из FQDN, но не FDQN из ip-адреса – K3rnel31

ответ

0

Мой короткий ответ будет простой способ построения полного доменного имени. Это может привести к сбою, если ваш сервер реализует несколько сетевых интерфейсов.

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

    return host + "." + domain; 
} 


Поскольку вы инициализацией ваш TCPListener с IPAddress.Any, согласно MSDN

основной поставщик услуг назначит наиболее подходящий сетевой адрес.

Это означает, что вы должны ждать, пока клиент не подключен, чтобы получить полное доменное имя, как вы не знаете заранее, что сетевой адрес, который вы получите назначены (и еще раз, если ваш сервер реализует несколько сетевых интерфейсов, не знаю, с кем клиент будет подключаться).
три шага будет необходимому для получения полного доменного имени сетевого интерфейса клиент подключен к:

  1. получить локальную конечную точку клиента (в качестве IPEndPoint)
  2. получить IP-адрес конечной точки
  3. получить запись хоста для этого IP-адреса (через Dns.GetHostEntry)

В коде это выглядит следующим образом:

//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); 
Смежные вопросы