Как упоминал Пол, простой 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);
}
Чтобы декодировать адрес без подключения к нему (например, чтобы убедиться, что он действителен или потому что вы подключаетесь через API, для которого требуется IP-адрес), этот метод сделает это (и при необходимости выполнит поиск 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
может возвращать несколько адресов. Я спросил об этом, и очевидно, можно просто взять первый адрес.
Исключение будет вызвано, если есть синтаксическая ошибка или проблема с разрешением доменного имени (FormatException
или SocketException
). Если пользователь указал доменное имя, но resolveDns==false
, этот метод возвращает null
.
person
Qwertie
schedule
11.03.2011