2011-06-27 31 views
4

我有这样的代码:无法解析域到C#中的IP?

IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse(txtBoxIP.Text), MainForm.port);

当我在txtBoxIP的IP(192.168.1.2)为例,它的伟大工程。

但是,如果我想把一个DNS?就像我把(my.selfip.com)我得到:

System.FormatException: An invalid IP address was specified. 
at System.Net.IPAddress.InternalParse(String ipString, Boolean tryParse) 

我如何使它支持IP和DNS?

谢谢:)

+3

我已经删除了[标签:解析]标记作为主机名转换成IP被称为“地址解析”,而不是“解析”。 – user7116

回答

8
IPAddress ipAddress; 
if (!IPAddress.TryParse (txtBoxIP.Text, out ipAddress)) 
    ipAddress = Dns.GetHostEntry (txtBoxIP.Text).AddressList[0]; 
serverEndPoint = new IPEndPoint(ipAddress, MainForm.port) 

不要忘记错误处理。

+2

是的,用TryParse更好:-) –

2

DNS到IP列表

IPHostEntry nameToIpAddress; 
nameToIpAddress = Dns.GetHostEntry("HostName"); 
foreach (IPAddress address in nameToIpAddress.AddressList) 
    Console.WriteLine(address.ToString()); 

然后你就可以使用IP公司在AddressList中。

Here是一个伟大的文章

+0

是的,但我怎样才能支持输入,DNS和IP? – Danpe

+0

如果输入不是IP地址,则首先将其转换为一个IP地址。然后像以前一样继续。 – FlyingStreudel

+1

您可以使用DNS名称解析的IP地址之一。使用IPAddress.TryParse()。如果成功,你有一个IP地址。如果没有,名称是DNS名称(或应该是),那么您需要通过DNS.GetHostEntry()解析名称。 –

1

你必须来查找IP主机名自己:

string addrText = "www.example.com"; 
IPAddress[] addresslist = Dns.GetHostAddresses(addrText); 

foreach (IPAddress theaddress in addresslist) 
{ 
    Console.WriteLine(theaddress.ToString()); 
} 

编辑

要分辨出两者之间的差值(BTW这使用C#的一些功能,可能在3.5及以上版本):

bool isDomain = false; 
foreach(char c in addrText.ToCharArray()) 
{ 
    if (char.IsLetter(c)){ 
    isDomain = true; 
    break; 
} 

if (isDomain) 
    // lookup IP here 
else 
    // parse IP here 
+0

是的,但我怎样才能支持输入,DNS和IP? – Danpe

+0

我认为这与ipv6地址有问题,因为它们的字符串表示可以包含字母。 – CodesInChaos

2

DNS名称不是IP地址。查看Dns.GetHostEntry()的DNS解析。

编辑补充:这是我做了什么:

public static IPEndPoint CreateEndpoint(string hostNameOrAddress , int port) 
{ 
    IPAddress addr ; 
    bool  gotAddr = IPAddress.TryParse(hostNameOrAddress , out addr) ; 

    if (!gotAddr) 
    { 
    IPHostEntry dnsInfo = Dns.GetHostEntry(hostNameOrAddress) ; 

    addr = dnsInfo.AddressList.First() ; 

    } 

    IPEndPoint instance = new IPEndPoint(addr , port) ; 
    return instance ; 
} 
2
var input = txtBoxIP.Text; 
IPAddress ip; 

// TryParse returns true when IP is parsed successfully 
if (!IPAddress.TryParse (input, out ip)) 
    // in case user input is not an IP, assume it's a hostname 
    ip = Dns.GetHostEntry (input).AddressList [0]; // you may use the first one 

// note that you'll also want to handle input errors 
// such as invalid strings that are neither IPs nor valid domains, 
// as well as hosts that couldn't be resolved 

var serverEndPoint = new IPEndPoint (ip, MainForm.port); 
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