Broadcast-IP errechnen

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

BadDeath

Betreff: Broadcast-IP errechnen

BeitragMo, Jun 23, 2008 18:23
Antworten mit Zitat
Benutzer-Profile anzeigen
So, ich habe im Zusammenhang mit einem Thread eine Funktion geschrieben, die die Broadcast-IP in einem Netzwerk mit vorgegebener Netzwerkmaske ermittelt.

Das ist praktisch, wenn man ein Spiel für das LAN programmiert und es nach allen offenen Servern suchen soll, denn durch senden an diese Broadcast-IP erhalten alle Geräte im Netz diese Pakete.

Hier der Code mit Aufrufbeispiel:

Code: [AUSKLAPPEN]
n = CountHostIPs("")
MeineIP = HostIP(1)

IP$ = DottedIP$(MeineIP)

Print "Broadcast-IP:" + Errechnen$(IP$, "255.255.255.0")

WaitKey
End



Function Errechnen$(IP$, Submask$)
   ;IP aufteilen
   IPClassA$ = Left$(IP$, Instr(IP$, ".")-1)
      IP$ = Mid$(IP$, Instr(IP$, ".")+1)
   IPClassB$ = Left$(IP$, Instr(IP$, ".")-1)
      IP$ = Mid$(IP$, Instr(IP$, ".")+1)
   IPClassC$ = Left$(IP$, Instr(IP$, ".")-1)
      IP$ = Mid$(IP$, Instr(IP$, ".")+1)
   IPClassD$ = IP$
   
   ;Subnetzmaske aufteilen
   SubClassA$ = Left$(Submask$, Instr(Submask$, ".")-1)
      Submask$ = Mid$(Submask$, Instr(Submask$, ".")+1)
   SubClassB$ = Left$(Submask$, Instr(Submask$, ".")-1)
      Submask$ = Mid$(Submask$, Instr(Submask$, ".")+1)
   SubClassC$ = Left$(Submask$, Instr(Submask$, ".")-1)
      Submask$ = Mid$(Submask$, Instr(Submask$, ".")+1)
   SubClassD$ = Submask$
   
   ;Dezimal zu Binär
   IP$ = ToBIT$(IPClassA$) + ToBIT$(IPClassB$) + ToBIT$(IPClassC$) + ToBIT$(IPClassD$)
   SubMask$ = ToBIT$(SubClassA$) + ToBIT$(SubClassB$) + ToBIT$(SubClassC$) + ToBIT$(SubClassD$)
   
   ;Invertieren
   For i = 1 To Len(SubMask$)
      If Mid$(Submask$, i, 1) = "1" Then SubMask2$ = SubMask2$ + "0"
      If Mid$(Submask$, i, 1) = "0" Then SubMask2$ = SubMask2$ + "1"
   Next
   
   ;OR-Verknüpfung
   For i = 1 To Len(IP$)
      If Mid$(Submask2$, i, 1) = 0 And Mid$(IP$, i, 1) = 0 Then
         Result$ = Result$ + "0"
      Else
         Result$ = Result$ + "1"
      End If
   Next
   
   ;Binär wieder in Dezimal
   ClassA$ = Mid$(Result$, 1, 9)
   ClassB$ = Mid$(Result$, 9, 8)
   ClassC$ = Mid$(Result$, 17, 8)
   ClassD$ = Mid$(Result$, 25, 8)
   
   ClassA$ = ToDec$(ClassA$)
   ClassB$ = ToDec$(ClassB$)
   ClassC$ = ToDec$(ClassC$)
   ClassD$ = ToDec$(ClassD$)

   Return ClassA$ + "." + ClassB$ + "." + ClassC$ + "." + ClassD$
End Function



Function ToDec$(Zahl$)
   If Mid$(Zahl$, 1, 1) = "1" Then Dec = Dec + 128
   If Mid$(Zahl$, 2, 1) = "1" Then Dec = Dec + 64
   If Mid$(Zahl$, 3, 1) = "1" Then Dec = Dec + 32
   If Mid$(Zahl$, 4, 1) = "1" Then Dec = Dec + 16
   If Mid$(Zahl$, 5, 1) = "1" Then Dec = Dec + 8
   If Mid$(Zahl$, 6, 1) = "1" Then Dec = Dec + 4
   If Mid$(Zahl$, 7, 1) = "1" Then Dec = Dec + 2
   If Mid$(Zahl$, 8, 1) = "1" Then Dec = Dec + 1
   
   Return Str$(Dec)
End Function



Function ToBIT$(Zahl)
   If Zahl >= 128 Then
      Zahl = Zahl - 128
      Out$ = Out$ + "1"
   Else
      Out$ = Out$ + "0"
   End If
   
   If Zahl >= 64 Then
      Zahl = Zahl - 64
      Out$ = Out$ + "1"
   Else
      Out$ = Out$ + "0"
   End If
   
   If Zahl >= 32 Then
      Zahl = Zahl - 32
      Out$ = Out$ + "1"
   Else
      Out$ = Out$ + "0"
   End If

   If Zahl >= 16 Then
      Zahl = Zahl - 16
      Out$ = Out$ + "1"
   Else
      Out$ = Out$ + "0"
   End If

   If Zahl >= 8 Then
      Zahl = Zahl - 8
      Out$ = Out$ + "1"
   Else
      Out$ = Out$ + "0"
   End If
   
   If Zahl >= 4 Then
      Zahl = Zahl - 4
      Out$ = Out$ + "1"
   Else
      Out$ = Out$ + "0"
   End If

   If Zahl >= 2 Then
      Zahl = Zahl - 2
      Out$ = Out$ + "1"
   Else
      Out$ = Out$ + "0"
   End If

   If Zahl >= 1 Then
      Zahl = Zahl - 1
      Out$ = Out$ + "1"
   Else
      Out$ = Out$ + "0"
   End If

   Return Out$
End Function


Wenn jemand Fehler findet, soll er sich bitte melden. Danke und viel Spaß!

PS: Alle Funktionen sind komplett selbst geschrieben, deswegen auch so umständlich Embarassed

Holzchopf

Meisterpacker

Betreff: Re: Broadcast-IP errechnen

BeitragMo, Jun 23, 2008 19:22
Antworten mit Zitat
Benutzer-Profile anzeigen
BadDeath hat Folgendes geschrieben:
PS: Alle Funktionen sind komplett selbst geschrieben, deswegen auch so umständlich Embarassed


Ja dann wollen wir das doch mal ändern Rolling Eyes

Code: [AUSKLAPPEN]
Function BroadcastIP$( IP$, Subnetmask$ )
   Local IPDigits[3], SubnetDigits[3]
   Local pos, i
   
   ; IP aufteilen
   For i = 0 To 3
      pos = Instr( IP$, "." )
      If pos > 0
         IPDigits[i] = Left( IP$, pos -1 )
         IP$ = Mid( IP$, pos +1 )
      Else
         IPDigits[i] = IP$
      EndIf
   Next

   ; Subnetmask aufteilen &invertieren
   For i = 0 To 3
      pos = Instr( Subnetmask$, "." )
      If pos > 0
         SubnetDigits[i] = Left( Subnetmask$, pos -1 ) Xor $FF
         Subnetmask$ = Mid( Subnetmask$, pos +1 )
      Else
         SubnetDigits[i] = Subnetmask$ Xor $FF
      EndIf
   Next
   
   ; IP maskieren
   For i = 0 To 3
      IPDigits[i] = IPDigits[i] Or SubnetDigits[i]
   Next
   
   Return IPDigits[0] +"." +IPDigits[1] +"." +IPDigits[2] +"." +IPDigits[3]
End Function


Wie du siehst, kann man XOR- OR- und auch alle anderen Byteoperationen direkt auf Ints anwenden, ohne diese vorher in mühsamer Handarbeit in 1/0-Strings umzuwandeln und dort dann jede Ziffer manuell verknüpfen.

MfG
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

BadDeath

BeitragMo, Jun 23, 2008 19:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Nagut.... meins ist zwar 4x so lang, dafür asuführlicher mit Funktionen, die man vllt auch noch so gebrauchen kann xD

Trotzdem danke!

Vertex

BeitragDi, Jun 24, 2008 13:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn Ihr IP-Adresse und Netzmaske in Integerform habt, dann geht es auch unkompliziert über:
Code: [AUSKLAPPEN]
broadcast = ip Or (~netmask)
vertex.dreamfall.at | GitHub

Goodjee

BeitragDi, Jun 24, 2008 15:15
Antworten mit Zitat
Benutzer-Profile anzeigen
das lässt alles andere irgendwie relativ alt aussehen Very Happy
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/
 

BadDeath

BeitragDi, Jun 24, 2008 21:07
Antworten mit Zitat
Benutzer-Profile anzeigen
So, mit Vertexs Methode sieht das ganze nochmal deutlich schlanker aus Laughing
Ein neues Projekt: wer schafft den Code noch kürzer? Razz

Code: [AUSKLAPPEN]
n = CountHostIPs("") : MeineIP = HostIP(1)

Sub$ = "255.255.255.0"

BroadCast = (MeineIP Or (~Int_IP(Sub$)))

Print "BroadCast: " + DottedIP$(BroadCast) + " = "+Broadcast

WaitKey
End


Function INT_IP(ip$)
   p1=Instr(ip$,".")
   p2=Instr(ip$,".",p1+1)
   p3=Instr(ip$,".",p2+1)
     Return (Int(Mid(ip$,1,p1))*16777216)+(Int(Mid(ip$,p1+1,p2-p1))*65536)+(Int(Mid(ip$,p2+1,p3-p2))*256)+Int(Mid(ip$,p3+1,-1))
End Function


Aber kürzer geht es nun glaube ich wirklich nicht mehr ^^

Noobody

BeitragDi, Jun 24, 2008 21:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Function BroadCastIP( SubMask$ )
     CountHostIPs("")
     IntIP = HostIP(1)
     CountHostIps( SubMask$ )
     Return IntIP Or ( ~HostIP( 1 ) )
End Function

Print "BroadCast: " + DottedIP$( BroadCastIP( "255.255.255.0" ) ) + " = " + BroadCastIP( "255.255.255.0" )

WaitKey()
End

Exclamation
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun
 

ke^kx

BeitragMi, Jun 25, 2008 13:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

Function BroadCastIP( SubMask$ ):CountHostIPs(""):IntIP=HostIP(1):CountHostIps(SubMask$):Return IntIP Or (~HostIP(1)):End Function:Print "BroadCast: "+DottedIP$(BroadCastIP("255.255.255.0"))+"="+BroadCastIP("255.255.255.0"):WaitKey():End


Ergibt bei mir zwar nen komischen wert von -XXXX aber naja^^
http://i3u8.blogspot.com
Asus Striker II
Intel Core2Quad Q9300 @ 2,5 GHz (aber nur zwei Kerne aktiv aufgrund der Instabilität -.-)
Geforce 9800 GTX
2GB RAM

Eingeproggt

BeitragDo, Jul 10, 2008 17:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich wollte die Notwendigkeit einer manuellen Subnetzmasken-Eingabe umgehen.
Das Problem trifft man zwar per Suche öfters im Forum an, aber es sind immer nur Lösungsansätze beschrieben. Ich konnte keinen Beitrag finden, in dem die Subnetzmaske mit BB ermittelt wurde.

Ich hab meine Überlegungen da gleich reingepackt. Scheint zu funktionieren.

[EDIT (11.07.2008, ~14:20)] Hab den Code ein ganz klein wenig geändert, da bei nicht vorhandener Netzwerkverbindung ein Fehler entstehen konnte. [EDIT]

Code: [AUSKLAPPEN]
Function BroadCastIP()
   ;Eigene IP
   CountHostIPs("")
   IntIP=HostIP(1)
   dotIP$=DottedIP(IntIP)
   
   ;Subnetzmaske
   homedrive$=Left(GetEnv("WinDir"),3)
   ipconfig=WriteFile(homedrive$+"temp.bat")
   WriteLine ipconfig,"ipconfig > "+Chr(34)+homedrive$+"ipconfig.txt"+Chr(34)
   CloseFile ipconfig
   ExecFile(homedrive$+"temp.bat")
   Delay 500
   DeleteFile homedrive$+"temp.bat"
   ipconfig=ReadFile(homedrive$+"ipconfig.txt")
   While Not Eof(ipconfig)
      txt$=ReadLine(ipconfig)
      If Instr(txt$,dotIP$) Then
         txt$=ReadLine(ipconfig)
         SubMask$=Right(txt$,Len(txt$)-Instr(txt$,":")-1)
         Exit
      EndIf
   Wend
   CloseFile ipconfig
   DeleteFile homedrive$+"ipconfig.txt"
   
   ;Broadcast Errechnen
   CountHostIPs(SubMask$)
   Return IntIP Or (~HostIP(1))
End Function


Viel Spass, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Eingeproggt

BeitragMi, Aug 13, 2008 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich entschuldige schonmal den Doppelpost, aber aktuelle Umstände zwangen mich zu einer erneuten Überarbeitung und ich dachte, ich lasse euch daran teilhaben:

Also unter Vista kann es ja passieren, dass man auf C:\ (oder wie das Windows-Laufwerk auch heißt) keine Schreibrechte hat. Deshalb wird die ganze Geschichte nun über temporäre Dateien in den Anwendungsdaten geregelt. Außerdem hab ich bei der Forensuche eine Möglichkeit von ChristianK entdeckt, die es erlaubt, den Vorgang ohne DOS-Fenster abzuwickeln (ShellExecute).

Wer also WinVista hat oder wen das DOS-Fenster stört, der bediene sich daran:

Code: [AUSKLAPPEN]
;Benötigte Userlib;
;.lib "shell32.dll"

;api_ShellExecute%( hwnd%, cmd$, file$, param$, dir$, show% )  : "ShellExecuteA"

Function BroadCastIP()
   ;Eigene IP
   CountHostIPs(GetEnv("localhost"))
   Local ip=HostIP(1)
   Local dotIP$=DottedIP(ip)
   Local txt$,SubMask$
   
   ;Subnetzmaske
   Local path$=GetEnv("appdata")+"\"
   Local ipconfig=WriteFile(path$+"temp.bat")
   WriteLine ipconfig,"ipconfig > "+Chr(34)+path$+"ipconfig.txt"+Chr(34)
   CloseFile ipconfig
   api_ShellExecute(0,"open",path$+"temp.bat","","",0)
   Delay 500
   DeleteFile path$+"temp.bat"
   ipconfig=ReadFile(path$+"ipconfig.txt")
   While Not Eof(ipconfig)
      txt$=ReadLine(ipconfig)
      If Instr(txt$,dotIP$) Then
         txt$=ReadLine(ipconfig)
         SubMask$=Right(txt$,Len(txt$)-Instr(txt$,":")-1)
         Exit
      EndIf
   Wend
   CloseFile ipconfig
   DeleteFile path$+"ipconfig.txt"
   
   ;Broadcast Errechnen
   CountHostIPs(SubMask$)
   Return ip Or (~HostIP(1))
End Function


mfG, Christoph.

EDIT (22.1.2010):
Sorry Chrise, keine Ahnung wie mir das passieren konnte. In meiner Userlib ist auch ShellExecuteA drinnen Confused
Ich habs jetzt für spätere "Finder" korrigiert.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
  • Zuletzt bearbeitet von Eingeproggt am Fr, Jan 22, 2010 23:48, insgesamt einmal bearbeitet

Chrise

BeitragFr, Jan 22, 2010 20:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!

Hey, mir tut das wirklich sowas von Leid, dass ich hier einen ewig alten Thread "pushe", wobei ich eigentlich nur eine zum letzten gezeigten Code habe.
Ich finde wirklich nichts in der suche, weder bei "dll userlib" noch "dll einbinden" oder derartiges.
Meine Frage ist:

wie funktioniert das mit der Shell32.dll userlib? Wie binde ich das in das Projekt funktionstüchtig ein oder brauche ich noch einen C(++) Code bei der ganzen Sache. Bei mir liefert die Funktion für die BroadCastIP nichts brauchbares (nein, wohl eher nur eine 0) und wenn ich das ganze als ausführbare Datei abspeichere, fehlt natürlich auch die dll irgendwie.... was hat es mit der api_Shell_execute auf sich?

kann mir das einer bitte erklären?
Dem wäre ich echt dankbar Smile

Gruß,
Chrise
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet.

BladeRunner

Moderator

BeitragFr, Jan 22, 2010 20:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Das geht per Decls - dazu kannst du in deinem Blitzbasic/userlibs-Ordner mal die Hilfedatei lesen wie die aufgebaut sind.
Im Prinzip erweiterst Du Blitz um Funktionen aus den Dlls.
Im hier vorliegenden Fall eine Dll die bei Windows schon vorinstalliert ist.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Chrise

BeitragFr, Jan 22, 2010 20:11
Antworten mit Zitat
Benutzer-Profile anzeigen
BladeRunner hat Folgendes geschrieben:
Das geht per Decls - dazu kannst du in deinem Blitzbasic/userlibs-Ordner mal die Hilfedatei lesen wie die aufgebaut sind.
Im Prinzip erweiterst Du Blitz um Funktionen aus den Dlls.
Im hier vorliegenden Fall eine Dll die bei Windows schon vorinstalliert ist.


jup, die habe ich mir schon ein paar mal durchgelesen. Muss ich die shell32.dll aus dem WINDOWS ordner kopieren und extra in den userlibs ordner kopieren?
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet.

Nicdel

BeitragFr, Jan 22, 2010 20:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, musst du nicht.
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

BladeRunner

Moderator

BeitragFr, Jan 22, 2010 20:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Alles was in Windows/system32 liegt wird automatisch erkannt.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Chrise

BeitragFr, Jan 22, 2010 20:31
Antworten mit Zitat
Benutzer-Profile anzeigen
bei mir wird, sobald die Funktion benötigt wird immer ein Runtimeerror gezeigt: "user lib function not found"
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet.

BladeRunner

Moderator

BeitragFr, Jan 22, 2010 20:32
Antworten mit Zitat
Benutzer-Profile anzeigen
hast Du denn die .decls angelegt?
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Chrise

BeitragFr, Jan 22, 2010 20:33
Antworten mit Zitat
Benutzer-Profile anzeigen
BladeRunner hat Folgendes geschrieben:
hast Du denn die .decls angelegt?

ja, da bin ich mir ziemlich sicher:

Die Datei hab ich so genannt:
api_ShellExecute.decls

der Inhalt lautet:
Code: [AUSKLAPPEN]
.lib "shell32.dll"

api_ShellExecute%( hwnd%, cmd$, file$, param$, dir$, show% )



Ist der Datei-name vielleicht das, was den Fehler verursacht? (gleich mal ausprobieren)
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet.

Nicdel

BeitragFr, Jan 22, 2010 20:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Normalerweise ist der Dateiname egal. Seltsamerweise geht es bei mir ebenfalls nicht (Win 7).

Edit: Fehler gefunden. Die Funktion heißt ShellExecuteA, hier die richtigen Decls:

Code: [AUSKLAPPEN]
.lib "shell32.dll"

ShellExecute%( hwnd%, cmd$, file$, param$, dir$, show% ) : "ShellExecuteA"
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

Chrise

BeitragFr, Jan 22, 2010 20:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah, wunderbar und funktioniert perfekt Nicdel!
Du hast einen Namen in meinem Projekt verdient Smile
Und auch vielen Dank an Bladerunner, bekommst auch nen "Credit-Keks" für die Hilfeleistung Wink

Gruß,
Chrise
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet.

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group