powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Получить список сетевых интерфейсов (IPv4 IP-адресов)
6 сообщений из 6, страница 1 из 1
Получить список сетевых интерфейсов (IPv4 IP-адресов)
    #38788839
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В VB6 делал так
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
Option Explicit

'MIB (Management Information Base) Structures
Public Type MIB_IPADDRROW
  dwAddr(0 To 3) As Byte                ' IP address
  dwIndex As Long                       ' interface index
  dwMask(0 To 3) As Byte                ' subnet mask
  dwBCastAddr(0 To 3) As Byte           ' broadcast address
  dwReasmSize As Long                   ' rassembly size
  unused As Long                        ' not currently used
End Type

Public Const ANY_SIZE = 16

Public Type MIB_IPADDRTABLE
  dwNumEntries As Long                  ' number of entries in the table
  Table(1 To ANY_SIZE) As MIB_IPADDRROW ' array of IP address entries
End Type

'IP Helper Functions
'IP Address Management
Public Declare Function GetIpAddrTable Lib "iphlpapi" _
 (pIpAddrTable As MIB_IPADDRTABLE, pdwSize As Long, ByVal Border As Long) As Long
'

Public Function GetIP() As String
  Dim Table As MIB_IPADDRTABLE
  Dim i As Integer
  
  If GetIpAddrTable(Table, Len(Table), 0) = 0 Then GetIP = Table.Table(1).dwAddr(0) & "." & Table.Table(1).dwAddr(1) & "." & Table.Table(1).dwAddr(2) & "." & Table.Table(1).dwAddr(3)
  MsgBox Table.dwNumEntries
  For i = 1 To Table.dwNumEntries
    MsgBox Table.Table(i).dwAddr(0) & "." & Table.Table(i).dwAddr(1) & "." & Table.Table(i).dwAddr(2) & "." & Table.Table(i).dwAddr(3)
  Next i
End Function



В .Net вроде нарыл вот это:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim host As IPHostEntry
    'Dim localIP As String
    host = Dns.GetHostEntry(Dns.GetHostName())
    Dim ip As IPAddress
    For Each ip In host.AddressList
      If ip.AddressFamily = Sockets.AddressFamily.InterNetwork Then
        Debug.WriteLine(ip.ToString)
      End If
    Next
  End Sub


Но меня несколько смущает то, что API-код возвращает 127.0.0.0 (LoopBack) среди прочих,
а приведенный .Net-код Loopback не возвращает (если закомментировать Sockets.AddressFamily.InterNetwork)
Хотя для своих целей я этот 127.0.0.0 все равно выкидываю из Table.

Т.е. это тоже самое или не совсем? В проге надо иметь возможность выбрать "сетевой интерфейс" из нескольких.

Есть вот еще:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    Dim nics As NetworkInterface() = NetworkInterface.GetAllNetworkInterfaces()
    Dim properties As IPGlobalProperties = IPGlobalProperties.GetIPGlobalProperties()
    Console.WriteLine("IPv4 interface information for {0}.{1}", properties.HostName, properties.DomainName)

    Dim adapter As NetworkInterface
    For Each adapter In nics
      ' Only display informatin for interfaces that support IPv4. 
      If adapter.Supports(NetworkInterfaceComponent.IPv4) Then
        Console.WriteLine(adapter.Description)
      End If
    Next adapter
  End Sub


Причем этот код более похож на API-код:

Т.е. на моем компе GetIpAddrTable дает:
192.168.11.2
127.0.0.1

А нижний .Net дает :

IPv4 interface information for d.
Контроллер семейства Realtek PCIe GBE
Software Loopback Interface 1

Т.е похоже на правду

Только вот не понимаю как нижним .Net-кодом получить IP-адреса.

API-вариант честно переписывать на .Net неохота, но хотелось бы уверенности что гарантированно получаю тот же результат.
...
Рейтинг: 0 / 0
Получить список сетевых интерфейсов (IPv4 IP-адресов)
    #38788853
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77В .Net вроде нарыл вот это:
оно кривое, ибо завязано на DNS

прямой путь - NetworkInterface.GetAllNetworkInterfaces()
далее GetIPProperties().UnicastAddresses (убедившись что интерфейс поддерживает IP -Supports(NetworkInterfaceComponent.IPv4)) ну и V4 и V6 конечно отработать
...
Рейтинг: 0 / 0
Получить список сетевых интерфейсов (IPv4 IP-адресов)
    #38788869
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

Так красиво? Ничего не упустил?
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
  Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
    For Each adapter In NetworkInterface.GetAllNetworkInterfaces()
      For Each uni In adapter.GetIPProperties().UnicastAddresses
        If (uni.Address.AddressFamily = Sockets.AddressFamily.InterNetwork) Then
          Debug.WriteLine(uni.Address.ToString)
        End If
      Next
    Next
  End Sub



Я выкинул вот эту проверку
Код: vbnet
1.
2.
3.
4.
      Dim uniCast As UnicastIPAddressInformationCollection = adapter.GetIPProperties().UnicastAddresses
      If uniCast.Count > 0 Then
        'Dim uni As UnicastIPAddressInformation
        For Each uni In uniCast


Я так понимаю она автоматически происходит и если =0 то в For Each uni эти uni отсутствуют,
ну и Dim-ы здесь не обязательны
InterNetwork==IPv4
Я прав или нет (по синтаксису кода)?

adapter.GetIPProperties().UnicastAddresses

Результат совпадает с GetIpAddrTable:
192.168.11.2
127.0.0.1

Просто компов с 2-мя сетевыми картами + Wi-Fi чтоб еще напрямую IP-шники получал не осталось.
...
Рейтинг: 0 / 0
Получить список сетевых интерфейсов (IPv4 IP-адресов)
    #38788889
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, да, еще я выкинул adapter.Supports(NetworkInterfaceComponent.IPv4),
наверно зря, перебор лишнего идет.
Тогда вот так:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
    For Each adapter In NetworkInterface.GetAllNetworkInterfaces()
      If adapter.Supports(NetworkInterfaceComponent.IPv4) Then
        For Each uni In adapter.GetIPProperties().UnicastAddresses
          If (uni.Address.AddressFamily = Sockets.AddressFamily.InterNetwork) Then
            Debug.WriteLine(uni.Address.ToString)
          End If
        Next
      End If
    Next
  End Sub
...
Рейтинг: 0 / 0
Получить список сетевых интерфейсов (IPv4 IP-адресов)
    #38788894
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проверку на Supports(NetworkInterfaceComponent.IPv4) зря опустил, попаадаются сетевые интерфейсы и без IP

а для отладки - подними туннель и посмотри что получается
...
Рейтинг: 0 / 0
Получить список сетевых интерфейсов (IPv4 IP-адресов)
    #38788899
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилпроверку на Supports(NetworkInterfaceComponent.IPv4) зря опустил,
Да понял я. Если убрать внутренний if, то буде больше строк, если убрать еще внешний, то еще больше.
Я думаю крайний вариант кода в самый раз.
Да и без проверки рабочий, просто перебираем лишнее - где заведомо отсутствует искомое.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Получить список сетевых интерфейсов (IPv4 IP-адресов)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]