2012-10-06 59 views
10

我正在尝试使TCP套接字连接到IP地址。我可以直接解析IP地址,这样做:在C#中解析来自DNS的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! 

但是,我无法弄清楚如何从DNS字符串神圣该IP地址。我试过下面的每个组合:

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? 

你们有一种灵魂有一个提示,以帮助我挤一个ip地址了DNS的?

回答

12
foreach (IPAddress ip in Dns.GetHostAddresses("www.mydns.org")) 
{ 
    Console.WriteLine(ip.ToString()); 
} 

或简单地IPAddress address = Dns.GetHostAddresses("www.mydns.org")[0];如果你只想要第一个。

+0

你的先生,是一个精灵。谢谢。 – Nanomurf

2
IPHostEntry entry = Dns.GetHostEntry(hostNameOrAddress: "www.google.com"); 
foreach (IPAddress addr in entry.AddressList) 
{ 
    // connect, on sucess call 'break' 
} 

只需通过调用GetHostEntry的只是列举地址,在sucess打破循环

3

我有一个非常整洁的扩展方法!

我考虑到了一个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