Avatar billede romme Nybegynder
14. oktober 2004 - 10:36 Der er 16 kommentarer og
1 løsning

Tjek om en ip er en del af et net

Hejsa

Nogle der kan lave en funktion, elller hjælpe mig på vej, der kan tjekke om en ip er en del af et net?

Funktionen skal f.eks. kunne tjekke om ip x.x.x.x er en del af nettet y.y.y.y/yy.
Kunne evt. være om ip 81.7.129.240 er en del af nettet 81.7.128.0/18
Avatar billede hiks Nybegynder
14. oktober 2004 - 10:47 #1
en del af nettet?

altså at ip'en eksisterer?

/hiks
Avatar billede romme Nybegynder
14. oktober 2004 - 10:53 #2
nej, om ip'en er en del af det angivet net.
Avatar billede hiks Nybegynder
14. oktober 2004 - 10:59 #3
altså du tænker på om ip'en findes i den angivne range?

altså om de 81.7.129.240 er en del af rangen: 81.7.128.0 - 81.7.128.18 ? Og i dette tilfælde returnere "False"!

/hiks
Avatar billede arne_v Ekspert
14. oktober 2004 - 11:02 #4
Du skal omregne strengene med IP adresser (som reelt er 4 byte) til long variabler.

Så skal du lave en long med nogle high bits sat. I dit tilfælde 14 high bits sat
og 18 low bits ikke sat.

Hvis

(adresselong and bitmasklong) = (netlong and bitmasklong)

så er adressen på det pågældende net.
Avatar billede arne_v Ekspert
14. oktober 2004 - 11:08 #5
Jeg sidder ikke lige ved en maskine med VB, så ....

Men noget a la:

Dim ip4b() As Long
ip4b = Split(ipstr,".")
Dim iplong As Long
iplong = ip4b(0)*256*256*256 + ip4b(1)*256*256 + ip4b(2)*256 + ip4b(3)

for at regne om fra streng til long
Avatar billede arne_v Ekspert
14. oktober 2004 - 11:09 #6
Og bitmasklong kan du vel starte med at sætte om som en hex konstant.
Avatar billede romme Nybegynder
14. oktober 2004 - 11:25 #7
Kan du pensle det lidt mere ud ?

Evt. hvis det er variablerne:
varIP  = "81.7.129.240"
varNet = "81.7.128.0/18"
Avatar billede arne_v Ekspert
14. oktober 2004 - 11:29 #8
plx har lige rettet mig i det andet spørgsmål /18 betyder 18 high bits sat og 14 low bits ikke sat
Avatar billede hiks Nybegynder
14. oktober 2004 - 11:30 #9
Hej

Har fundet et projekt på nettet som jeg har modificeret til dig. Du skal have 3 textboxe:

IPrStart er IpRangeStart i dit tilfælde 81.7.128.0
IPrSlut er IpRangeSlut i dit tilfælde 81.7.128.18

IpTjeck er Ip'en du vil tjekke i dit tilfælde 81.7.129.240

Og så skal du ha en command button: Command1

Here goes:

Option Explicit

Private Type TByteRec
  B(1 To 8) As Byte
End Type

Private Type TCcyRec
  C As Currency
End Type

Private Sub Command1_Click()
  Call LS_PrintRange(IPrStart.Text, IPrSlut.Text)
End Sub

Private Sub LS_PrintRange(LoIP$, HiIP$)
  Dim LO As Currency, HI As Currency
  Dim l9 As Currency
 
  LO = LF_IpToCcy(LoIP$)
  HI = LF_IpToCcy(HiIP$)
       
  Debug.Print LF_CcyToIP(LO)
  Debug.Print LF_CcyToIP(HI)
  ' these numbers are fairly meaningless to a human
  Debug.Print LO
  Debug.Print HI
  Debug.Print
  ' --- Currency is an 8 Byte Integer / 10000
  For l9 = LO To HI Step 0.0001
       
        If LF_CcyToIP(l9) = IpTjeck.Text Then
            MsgBox "HURRA"
        End If
       
        Debug.Print LF_CcyToIP(l9)
  Next
 
End Sub

Private Function LF_IpToCcy(ip$) As Currency
  Dim ByteRec As TByteRec
  Dim CcyRec As TCcyRec
  Dim l9&, q&, pos&
 
  ' Fill in the Low 4 bytes [4][3][2][1]
  ' Here one would use Split() in VB6
  q = 1
  For l9 = 1 To 4
      pos = InStr(q, ip$, ".")
      If pos = 0 Then pos = Len(ip$) + 1
      ByteRec.B(5 - l9) = Val(Mid$(ip$, q, pos - q))
      q = pos + 1
  Next
  ' ---
  LSet CcyRec = ByteRec
  LF_IpToCcy = CcyRec.C
 
End Function

Private Function LF_CcyToIP(No As Currency) As String
  Dim ByteRec As TByteRec
  Dim CcyRec As TCcyRec
  Dim l9&, S$
 
  CcyRec.C = No
  LSet ByteRec = CcyRec
 
  ' --- Build 4.3.2.1
  For l9 = 1 To 4
      S$ = CStr(ByteRec.B(l9)) + S$
      If l9 < 4 Then S$ = "." + S$
  Next
 
  LF_CcyToIP$ = S$
     
End Function
Avatar billede arne_v Ekspert
14. oktober 2004 - 11:31 #10
Dim varIP As String
varIP  = "81.7.129.240"
Dim ip4b() As Long
ip4b = Split(varIP,".")
Dim iplong As Long
iplong = ip4b(0)*256*256*256 + ip4b(1)*256*256 + ip4b(2)*256 + ip4b(3)

Og samme udregning for "81.7.128.0"
Avatar billede arne_v Ekspert
14. oktober 2004 - 11:33 #11
masken er

&Hffffc000
Avatar billede hiks Nybegynder
14. oktober 2004 - 11:55 #12
hva er der lige galt med den kode?

/hiks
Avatar billede romme Nybegynder
14. oktober 2004 - 12:12 #13
arne_v > Så bør følgende virke:

ipstr         = "81.7.128.0"
highbits     = "18"
iptjek        = "81.7.129.240"

ip4b = Split(ipstr,".")
iplong = ip4b(0)*256*256*256 + ip4b(1)*256*256 + ip4b(2)*256 + ip4b(3)
netlong = (iplong + (2^(32-highbits)))-1
iptjek4b = Split(iptjek,".")
iptjeklong = iptjek4b(0)*256*256*256 + iptjek4b(1)*256*256 + iptjek4b(2)*256 + iptjek4b(3)

If (iptjeklong>=iplong) AND (iptjeklong<=netlong) Then
    wscript.echo "IP " & iptjek & " er del af nettet " & ipstr & "/" & highbits
Else
    wscript.echo "IP " & iptjek & " er IKKE del af nettet " & ipstr & "/" & highbits
End If
Avatar billede arne_v Ekspert
14. oktober 2004 - 12:28 #14
Umiddelbart ser der OK ud.

Jeg er en lille smule bekymret for IP adresser fra 128.x.x.x og opad
og unsigned versus negative tal.

Men prøv ad !
Avatar billede arne_v Ekspert
14. oktober 2004 - 21:03 #15
Jeg har lige prøvet.

Følgende VB virker fint med 80'er adresser:

Private Function StringToLong(addr As String) As Long
    Dim parts() As String
    parts = Split(addr, ".")
    StringToLong = CLng(parts(0)) * 256 * 256 * 256 + CLng(parts(1)) * 256 * 256 + CLng(parts(2)) * 256 + CLng(parts(3))
End Function

Private Sub Check_Click()
    Dim netval As Long
    netval = StringToLong(net.Text)
    Dim hostval As Long
    hostval = StringToLong(host.Text)
    Dim netsize As Integer
    netsize = 2 ^ (32 - CInt(size.Text))
    If (netval <= hostval) And (hostval <= netval + netsize - 1) Then
        MsgBox "Same net"
    Else
        MsgBox "Different net"
    End If
End Sub
Avatar billede arne_v Ekspert
14. oktober 2004 - 21:11 #16
Og ditto i VBS:

net = "81.7.128.0"
host = "81.7.129.240"
bits = 18
parts = Split(net, ".")
netval = CLng(parts(0)) * 256 * 256 * 256 + CLng(parts(1)) * 256 * 256 + CLng(parts(2)) * 256 + CLng(parts(3))
parts = Split(host, ".")
hostval = CLng(parts(0)) * 256 * 256 * 256 + CLng(parts(1)) * 256 * 256 + CLng(parts(2)) * 256 + CLng(parts(3))
netsize = 2 ^ (32 - bits)
If (netval <= hostval) And (hostval <= netval + netsize - 1) Then
    MsgBox "Same net"
Else
  MsgBox "Different net"
End If
Avatar billede arne_v Ekspert
17. oktober 2004 - 17:20 #17
Et svar for mit bidrag
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester