I was working on an old ASP.NET application written in C#, which uses the following method to code to get the IP address of the server it runs on:
public string GetIPAddress()
{
IPHostEntry Host = default(IPHostEntry);
string Hostname = null;
Hostname = System.Environment.MachineName;
Host = Dns.GetHostEntry(Hostname);
string IPAddress = "";
foreach (IPAddress IP in Host.AddressList)
{
if (IP.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
IPAddress = Convert.ToString(IP);
}
}
return IPAddress;
}
Apart from the doubt about the correctness of the code to obtain the IP address of the machine, at the line with the call to “Dns.GetHostEntry”, I got the following error: “System.Net.Sockets.SocketException (0x80004005): No such host is known”.
Consider that this code always worked in other environments, but on this server I got the exception above. I didn’t have much time, so I looked for a quick and dirty solution….
The problem seemed to be due to the fact that the call to “Dns.GetHostEntry” could not resolve the machine name in a valid Host object. So I tried to modify the windows file “host”, which you can find in “C:\Windows\System32\drivers\etc”, in the following way.
# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
# 102.54.94.97 rhino.acme.com # source server
# 38.25.63.10 x.acme.com # x client host
# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
# ::1 localhost
# Added the following line to solve the "No such host is known" error...
10.0.0.5 SDAADMIN384759XXX
On the left you can see the IP address of the server (in this case a private IP address because the server is behind a NAT), and on the right you can see the host name. Pay attention: the host name you enter must match the host name you would get calling “System.Environment.MachineName”.
Using this workaround I managed to avoid the exception and get the application running without modifying the source code, maybe getting a wrong IP address but in this case it wasn’t important.