Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: Lähiverkon IPv4-osoitteet ja koneiden nimet

Happy [14.02.2014 14:53:09]

#

Moi Kaikille.

Täällä taas lähes kolmen vuoden jälkeen....

Eli kuten otsikkokin kertoo, pitäs saada listattua lähiverkon koneiden nimet ja ipv4 osoitteet.

Yritin lähestyä hommaa näin...

Imports System.Net
Imports System.Net.NetworkInformation

Public Class Form1
    Public Sub getinterfaces()
        Dim nics As NetworkInterface() = NetworkInterface.GetAllNetworkInterfaces()
        If nics.Length < 0 Or nics Is Nothing Then
            MsgBox("no network interfaces found")
            Exit Sub
        End If

        ListView1.Items.Clear()

        For Each netadapter As NetworkInterface In nics

            Dim intproperties As IPInterfaceProperties = netadapter.GetIPProperties()

            ListView1.Items.Add(netadapter.Name)

            Dim paddress As PhysicalAddress = netadapter.GetPhysicalAddress()
            Dim addbyte As Byte() = paddress.GetAddressBytes()
            Dim macaddress As String = ""

            For i = 0 To addbyte.Length - 1
                macaddress &= addbyte(i).ToString("X2")
                If i <> addbyte.Length - 1 Then
                    macaddress &= "-"
                End If
            Next

            Dim icount As Integer = ListView1.Items.Count


            Try
                With ListView1.Items(icount - 1).SubItems
                    .Add(macaddress)
                    .Add(intproperties.UnicastAddresses(2).Address.ToString)
                    .Add(intproperties.UnicastAddresses(2).IPv4Mask.ToString)
                    .Add(intproperties.UnicastAddresses(0).Address.ToString)
                    .Add(intproperties.UnicastAddresses(1).Address.ToString)

                End With
            Catch ex As Exception

            End Try
            ListView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent)

        Next

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        getinterfaces()
    End Sub
End Class

Mutta tuo ei anna koneen nimiä vaan - LOCAL AREA CONNECTIONS * 9
Ja IP osoitteet on jotain hex numeroita - 00-00-00-00-00-00-00-E0

Voisko joku kokeilla tuota koodia ja kertoa toimiiko se vai onko ongelma mun LAN-päätteessä.

Tai jos jollakulla on parempi ratkaisu tän toteutukseen niin sekin käy.

Happy.

vuokkosetae [14.02.2014 20:29:34]

#

Villi veikkaus, että gePhysicalAddress on MAC-osoite.

Verkoin koneiden nimien tietäminen on hieman hankalaa. Jotain voisit pyytää järjestelmästä ARP taulusta, mutta se ei ole ehkä näppärää.

Helpointa lienee katsoa IP-osoitetta esimerkiksi 192.168.1.124/24 Eli netmaski olisi 255.255.255.0 sitten vain kysellä koneiden nimet. Esimerkissä kaikki 254 osoitetta ja vaikka yrittää ottaa yhteyttä niihin. Tai jotain. socket ja siihen liittyvät rajapinnat voivat olla sinua kiinnostavia gethostbyaddress vai mikäs se nyt olikaan.

Pahoittelen. En tiedä VB:stä tuon taivaallista.

groovyb [16.02.2014 00:44:51]

#

Tälläinen pätkä tuli vastaan:

Imports System.Net.NetworkInformation
Imports System.Threading

Module Module1

    Private pingers As New List(Of Ping)

    Private instances As Integer = 0
    Private lock As New Object

    Private result As Integer = 0

    Private timeOut As Integer = 250
    Private ttl As Integer = 5

    Sub Main()

        Dim baseIP As String = "192.168.1."
        Dim classD As Integer = 1

        Console.WriteLine("Pinging 255 destinations of D-class in {0}*", baseIP)

        CreatePingers(255)

        Dim po As New PingOptions(ttl, True)
        Dim enc As New System.Text.ASCIIEncoding
        Dim data As Byte() = enc.GetBytes("abababababababababababababababab")

        Dim wait As New SpinWait
        Dim cnt As Integer = 1

        Dim watch As Stopwatch = Stopwatch.StartNew

        For Each p As Ping In pingers
            SyncLock lock
                instances += 1
            End SyncLock

            p.SendAsync(String.Concat(baseIP, cnt.ToString()), timeOut, data, po)
            cnt += 1
        Next

        Do While instances > 0
            wait.SpinOnce()
        Loop

        watch.Stop()

        DestroyPingers()

        Console.WriteLine("Finished in {0}. Found {1} active IP-addresses.", watch.Elapsed.ToString(), result)
        Console.ReadKey()

    End Sub

    Sub Ping_completed(s As Object, e As PingCompletedEventArgs)

        SyncLock lock
            instances -= 1
        End SyncLock

        If e.Reply.Status = IPStatus.Success Then
            Console.WriteLine(String.Concat("Active IP: ", e.Reply.Address.ToString()))
            result += 1
        Else
            'Console.WriteLine(String.Concat("Non-active IP: ", e.Reply.Address.ToString()))
        End If

    End Sub

    Private Sub CreatePingers(cnt As Integer)

        For i As Integer = 1 To cnt
            Dim p As New Ping
            AddHandler p.PingCompleted, AddressOf Ping_completed
            pingers.Add(p)
        Next
    End Sub
    Private Sub DestroyPingers()

        For Each p As Ping In pingers
            RemoveHandler p.PingCompleted, AddressOf Ping_completed
            p.Dispose()
        Next

        pingers.Clear()

    End Sub

End Module

Happy [20.02.2014 19:11:32]

#

Kiitoksia groovyb!!!!

Toimii.... Ainakin noitten ip-osoitteiden hakemiseen, mutta kun vielä saisi sen koneen nimen niin sitten se olisi täydellinen....

Luin kyllä jostain että .NET:llä ei ole mahdollista hakea verkon koneiden nimiä jonkun "vakoilu" mahdollisuuden takia.... Tiedäppä nyt siitä sitten???

Happy.

Metabolix [20.02.2014 20:38:32]

#

”Koneen nimi” ei ole mikään yksiselitteinen asia. Jos kone ei itse kerro nimeään, et voi mitenkään hakea sitä. Riippuu verkostasi, millaisia vaihtoehtoja nimen hakemiseen on. Jos verkossasi on sopiva DNS-palvelin, saat jonkinlaisen nimen funktiolla System.Net.Dns.GetHostEntry. Netissä vihjattiin, että funktio saattaa onnistua hakemaan myös NetBIOS-nimen, jos DNS-haku ei tärppää.

nimi = System.Net.Dns.GetHostEntry("192.168.0.1").HostName

Happy [27.02.2014 02:35:00]

#

Metabolix kirjoitti:

”Koneen nimi” ei ole mikään yksiselitteinen asia.... Riippuu verkostasi, millaisia vaihtoehtoja nimen hakemiseen on.

nimi = System.Net.Dns.GetHostEntry("192.168.0.1").HostName

Kyllähän se näin menee... Onnistuin saamaan tuolla...

nimi = System.Net.Dns.GetHostEntry("XXX.XXX.XXX.XXX").HostName

lähiverkon "koneiden nimet". Toki se antaa myös reitittemen nimen siihen lisäksi...

Eli, jos mun koneen nimi on "Happy-PC", niin mulla tuo antaa koneen nimeksi "FritZ!BoxHappy-PC".

Mutta kyllähän se noinki toimii... :D

Kiitoksia Metabolix!

Ja sitten leuka rinnassa kohti uusia haasteita.... :(

Happy.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta