2011-06-27 54 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