正如保羅所說,沒有端口號,一個普通的IP地址可以通過IPAddress.Parse()
解析。但是,如果有端口號和/或主機名(12.34.56.78:90或www.example.com:5555),則需要採用不同的方法。如果你想使用TcpClient的連接,這一功能將這樣做:
public static TcpClient Connect(string ipAndPort, int defaultPort)
{
if (ipAndPort.Contains("/"))
throw new FormatException("Input should only be an IP address and port");
// Uri requires a prefix such as "http://", "ftp://" or even "foo://".
// Oddly, Uri accepts the prefix "//" UNLESS there is a port number.
Uri uri = new Uri("tcp://" + ipAndPort);
string ipOrDomain = uri.Host;
int port = uri.Port != -1 ? uri.Port : defaultPort;
return new TcpClient(ipOrDomain, port);
}
的defaultPort
參數指定如果輸入字符串沒有一個使用的端口。例如:
using (NetworkStream s = Connect("google.com", 80).GetStream())
{
byte[] line = Encoding.UTF8.GetBytes("GET/HTTP/1.0\r\n\r\n");
s.Write(line, 0, line.Length);
int b;
while ((b = s.ReadByte()) != -1)
Console.Write((char)b);
}
不用連接到它解碼地址(例如,以驗證它是有效的,或者因爲你通過,需要一個IP地址的API連接),此方法將做到這一點(和可選執行DNS查找):
public static IPAddress Resolve(string ipAndPort, ref int port, bool resolveDns)
{
if (ipAndPort.Contains("/"))
throw new FormatException("Input address should only contain an IP address and port");
Uri uri = new Uri("tcp://" + ipAndPort);
if (uri.Port != -1)
port = uri.Port;
if (uri.HostNameType == UriHostNameType.IPv4 || uri.HostNameType == UriHostNameType.IPv6)
return IPAddress.Parse(uri.Host);
else if (resolveDns)
return Dns.GetHostAddresses(uri.Host)[0];
else
return null;
}
奇怪的是,Dns.GetHostAddresses
可以返回多個地址。我asked about it,顯然它可以簡單地採取第一個地址。
如果出現語法錯誤或解決域名問題(FormatException
或SocketException
),將引發異常。如果用戶指定了域名但resolveDns==false
,則此方法返回null
。
IPAddress.Parse(「23.45.67.89:1024」)引發FormatException,所以我猜答案是「排序」。 – Qwertie 2011-03-11 19:14:50
這不是一個有效的IP地址。端口號不是TCP/IP堆棧的IP部分的一部分。 IP地址沒有端口。你正在使用的是更接近於_URI_這也是與Uri類解析。 – 2011-03-11 19:28:00
由於IPv6地址也包含冒號,我不知道解碼包含端口號的IPv6地址或IPv4地址的正確方法。也許可以從IPAddress.TryParse開始,如果失敗,請查找端口號,解析它,刪除它,然後重試。如果仍然失敗,請使用System.Net.Dns.Resolve作爲域名解析 - 但我很困惑,因爲它返回的IPHostEntry可以包含多個IP地址。從什麼時候一個域名有多個IP地址?我們是否應該嘗試連接所有這些? – Qwertie 2011-03-11 19:33:29