2010-01-12 3 views
7

У меня есть следующий код:.Net IPAddress IPv4

Dim ipAdd As IPAddress = Dns.GetHostEntry(strHostname).AddressList(0) 
Dim strIP As String = ipAdd.ToString() 

Когда я преобразовать в строку вместо адреса IPv4, как 192.168.1.0 или аналогичный, я получаю версию IPv6: fd80 :: 5dbe: 5d89: e51b : адрес d313.

Есть ли способ вернуть IPv4-адрес из типа IPAddress?

Благодаря

ответ

15

Вместо того, чтобы безоговорочно принимать первый элемент AddressList, вы могли бы взять на себя первый адрес IPv4: решение

var address = Dns.GetHostEntry(strHostname) 
       .AddressList 
       .First(ip => ip.AddressFamily == AddressFamily.InterNetwork); 
+0

Вот версия VB: Dim ipAdd As IPAddress = Dns.GetHostEntry («aol.com»). AddressList.First (Функция (f) f.AddressFamily = Sockets.AddressFamily.InterNetwork) –

2

DTB будет работать во многих ситуациях. Однако во многих случаях пользователи могут иметь несколько настроек IP-адресов v4 в своей системе. Иногда это происходит потому, что у них есть некоторые «виртуальные» адаптеры (от таких приложений, как VirtualBox или VMWare), или потому, что у них есть несколько физических сетевых адаптеров, подключенных к их компьютеру.

Само собой разумеется, что в этих ситуациях важно использовать правильный IP-адрес. Возможно, вам захочется спросить пользователя, какой IP-адрес подходит.

Чтобы получить список используемых IP-адресов v4 вы можете использовать код, подобный:

«Получить массив, который содержит все доступные IP-адреса: Dim IPList() As IPAddress = Net.Dns.GetHostEntry (Net. Dns.GetHostName.ToString) .AddressList

'Copy valid IPs from IPList to FinalIPList 
Dim FinalIPList As New ArrayList(IPList.Length) 
For Each IP As IPAddress In IPList 
    'We want to keep IPs only if they are IPv4 and not a 'LoopBack' device 
    '(an InterNetwork AddressFamily indicates a v4 IP) 
    If ((Not IPAddress.IsLoopback(IP)) And (IP.AddressFamily = AddressFamily.InterNetwork)) Then 
     FinalIPList.Add(IP) 
    End If 
Next IP 
0

для меня решение с предикатом «Первый» не работает должным образом, это код, который работает для меня:

public static string GetLocalIP() 
     { 
      string ipv4Address = String.Empty; 

      foreach (IPAddress currrentIPAddress in Dns.GetHostAddresses(Dns.GetHostName())) 
      { 
       if (currrentIPAddress.AddressFamily.ToString() == System.Net.Sockets.AddressFamily.InterNetwork.ToString()) 
       { 
        ipv4Address = currrentIPAddress.ToString(); 
        break; 
       } 
      } 

      return ipv4Address; 
     } 
Смежные вопросы