Broadcast-IP errechnen
Übersicht

BadDeathBetreff: Broadcast-IP errechnen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
![]() |
HolzchopfMeisterpackerBetreff: Re: Broadcast-IP errechnen |
![]() Antworten mit Zitat ![]() |
---|---|---|
BadDeath hat Folgendes geschrieben: PS: Alle Funktionen sind komplett selbst geschrieben, deswegen auch so umständlich
![]() Ja dann wollen wir das doch mal ändern ![]() 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 BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
BadDeath |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
das lässt alles andere irgendwie relativ alt aussehen ![]() |
||
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/ |
BadDeath |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
So, mit Vertexs Methode sieht das ganze nochmal deutlich schlanker aus ![]() Ein neues Projekt: wer schafft den Code noch kürzer? ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Gruß, Chrise |
||
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet. |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ah, wunderbar und funktioniert perfekt Nicdel!
Du hast einen Namen in meinem Projekt verdient ![]() Und auch vielen Dank an Bladerunner, bekommst auch nen "Credit-Keks" für die Hilfeleistung ![]() Gruß, Chrise |
||
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group