Reputation: 1521
I have been through a lot of googling for this, I found a lot of examples none of which was working for me. This is a simple issue which I feel has a simple answer without defining new classes\modules etc...
My code is this :
Console.WriteLine ("Please enter an IP address or hostname");
string host = Console.ReadLine ();
***IP = resolved "host"***
Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
s.Connect (IP, 80);
s.close();
How do I actually resolve the IP variable?
Upvotes: 53
Views: 101064
Reputation: 2377
You can simply use the DNS class to do so:
IPHostEntry hostEntry = Dns.GetHostEntry(host);
//you might get more than one ip for a hostname since
//DNS supports more than one record
if (hostEntry.AddressList.Length > 0)
{
var ip = hostEntry.AddressList[0];
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
s.Connect(ip, 80);
}
Upvotes: 103
Reputation: 350
If all you want is to resolve a string that could represent either a hostname OR an IP address, you probably want to use System.Net.Dns.GetHostAddresses() rather than System.Net.Dns.GetHostEntry().
GetHostAddresses() skips the DNS lookup if the string parses to an IP address already, while GetHostEntry() will do a reverse lookup for the hostname.
https://learn.microsoft.com/en-us/dotnet/api/system.net.dns.gethostaddresses
Upvotes: 2
Reputation: 5
The IpAddress has the appropriate method for parsing hostname to IpAddress.
IPAddress addr = IPAddress.Parse(hostName)
Upvotes: -3
Reputation: 2803
This is the method I use to resolve a hostname to IPv4 and / or IPv6.
using System.Net:
// A host can have multiple IP addresses!
public static IPAddress[] GetIPsByName(string hostName, bool ip4Wanted, bool ip6Wanted)
{
// Check if the hostname is already an IPAddress
IPAddress outIpAddress;
if (IPAddress.TryParse(hostName, out outIpAddress) == true)
return new IPAddress[] { outIpAddress };
//<----------
IPAddress[] addresslist = Dns.GetHostAddresses(hostName);
if (addresslist == null || addresslist.Length == 0)
return new IPAddress[0];
//<----------
if (ip4Wanted && ip6Wanted)
return addresslist;
//<----------
if (ip4Wanted)
return addresslist.Where(o => o.AddressFamily == AddressFamily.InterNetwork).ToArray();
//<----------
if (ip6Wanted)
return addresslist.Where(o => o.AddressFamily == AddressFamily.InterNetworkV6).ToArray();
//<----------
return new IPAddress[0];
}
Upvotes: 3
Reputation: 4453
Please take the note that accepted answer can resolve to IPv6. I attempted to connect to service that does not accept IPv6 as input string.
Therefore try this snippet if you care to get IPv4:
using System.Linq;
string host = "google.com";
Dns.GetHostEntry(host).AddressList.First(addr => addr.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
Upvotes: 11