Ответ 1
foreach (IPAddress ip in Dns.GetHostAddresses("www.mydns.org"))
{
Console.WriteLine(ip.ToString());
}
или просто IPAddress address = Dns.GetHostAddresses("www.mydns.org")[0];
, если вы хотите только первый.
Я пытаюсь подключить сокет TCP к IP-адресу. Я могу сделать это, непосредственно разобрав IP-адрес следующим образом:
IPAddress ipAddress = IPAddress.Parse("192.168.1.123");
IPEndPoint remoteEP = new IPEndPoint(ipAddress, 80);
// Create a TCP/IP socket.
Socket sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // This works!
Однако я не могу понять, как удалить этот IP-адрес из строки DNS. Я пробовал каждую комбинацию из следующего:
IPAddress ipAddress = Dns.Resolve("www.mydns.org"); // No dice
IPAddress ipAddress = Dns.GetHostEntry("www.mydns.org"); // Nada
IPAddress ipAddress = IPAddress.Parse(Dns.Resolve("www.mydns.org")); // So many errors...
IPAddress ipAddress = IPAddress.Parse(Dns.Resolve("www.mydns.org").toString()); // WTh is this attempt anyway?
У кого-нибудь из вас добрых душ есть подсказка, чтобы помочь мне выжать IPAddress из DNS?
foreach (IPAddress ip in Dns.GetHostAddresses("www.mydns.org"))
{
Console.WriteLine(ip.ToString());
}
или просто IPAddress address = Dns.GetHostAddresses("www.mydns.org")[0];
, если вы хотите только первый.
У меня есть очень аккуратный метод расширения для этого!
Принимаю во внимание, что IPV6 может быть возвращен в качестве первого адреса в списке адресов, возвращаемых классом DNS, и позволяет вам "одобрить" IPV6 или IPV4 для результата. Вот полностью документированный класс (только с подходящим методом для этого случая по соображениям краткости):
using System;
using System.Linq;
using System.Net;
using System.Net.Sockets;
/// <summary>
/// Basic helper methods around networking objects (IPAddress, IpEndPoint, Socket, etc.)
/// </summary>
public static class NetworkingExtensions
{
/// <summary>
/// Converts a string representing a host name or address to its <see cref="IPAddress"/> representation,
/// optionally opting to return a IpV6 address (defaults to IpV4)
/// </summary>
/// <param name="hostNameOrAddress">Host name or address to convert into an <see cref="IPAddress"/></param>
/// <param name="favorIpV6">When <code>true</code> will return an IpV6 address whenever available, otherwise
/// returns an IpV4 address instead.</param>
/// <returns>The <see cref="IPAddress"/> represented by <paramref name="hostNameOrAddress"/> in either IpV4 or
/// IpV6 (when available) format depending on <paramref name="favorIpV6"/></returns>
public static IPAddress ToIPAddress(this string hostNameOrAddress, bool favorIpV6=false)
{
var favoredFamily = favorIpV6 ? AddressFamily.InterNetworkV6 : AddressFamily.InterNetwork;
var addrs = Dns.GetHostAddresses(hostNameOrAddress);
return addrs.FirstOrDefault(addr => addr.AddressFamily == favoredFamily)
??
addrs.FirstOrDefault();
}
}
Не забудьте поставить этот класс в пространство имен!: -)
Теперь вы можете просто сделать это:
var server = "http://simpax.com.br".ToIPAddress();
var blog = "http://simpax.codax.com.br".ToIPAddress();
var google = "google.com.br".ToIPAddress();
var ipv6Google = "google.com.br".ToIPAddress(true); // if available will be an IPV6
IPHostEntry entry = Dns.GetHostEntry(hostNameOrAddress: "www.google.com");
foreach (IPAddress addr in entry.AddressList)
{
// connect, on sucess call 'break'
}
Просто перечислите адрес, вызвав GetHostEntry, при успешном завершении цикла