Hallo
ich will bei meinem Programm die Broadcastadresse ermitteln.
Ich habe die lokale Adresse und von der würde ich gerne die Broadcastadresse ermitteln.
Also so:
lokale IP: 192.168.0.1
Broadcast: 192.168.0.255 => soll errechnet werden
Gibt es da vielleicht eine Funktion?
Oder wie soll ich das Problem angehen?
mfg
Hallo bloodhound,
guck dir mal die Klasse System.Net.IPAddress an.
MfG hulkstar
Möp.
Also so:
lokale IP: 192.168.0.1
Broadcast: 192.168.0.255 => soll errechnet werden
Sollte es keine vorgefertige Funktionen geben, kannst du mit der Subnetzmaske hantieren. Die Lokale IP mit der Subnetzmaske bitweise logisch verknüpfen um den Hostanteil der Ip zu bekommen. Füllst du nun den Geräteteil nur mit Einsen, so erhälst du die Broadcastadresse in dem Netzwerk.
mit freundlichen Grüßen,
Tomot
Projekte: www.gesellschaftsspieler-gesucht.de
Ich hab mich jetzt mal umgesehen und folgendes entdeckt:
public void PrintBroadcastAddress()
{
// Get the IP Broadcast address and convert it to string.
string ipAddressString = IPAddress.Broadcast.ToString();
MessageBox.Show(ipAddressString);
Console.WriteLine("Broadcast IP address: {0}", ipAddressString);
}
Hier bekomm ich allerdings die Adresse 255.255.255.255 .
Wenn ich die Adresse als Broadcastadresse angebe funktioniert das leider nicht.
Mach ich was falsch? Oder gibt es eine Möglichkeit einen Broadcast über 255.255.255.255 zu schicken?
mfg
Limited Broadcast
Als Ziel wird die IP-Adresse 255.255.255.255 [= IPAddress.Broadcast] angegeben. Dieses Ziel liegt immer im eigenen Netz und wird direkt in einen Ethernet-Broadcast umgesetzt. Ein limited broadcast wird von einem Router nicht weitergeleitet.Directed Broadcast
Das Ziel sind die Teilnehmer eines bestimmten Netzes. Generally, the broadcast address is found by taking the bit complement [Bitweises NICHT] of the subnet mask and then OR-ing it bitwise with the IP address.
also
Broadcast-Adresse = IP-Adresse ODER (NICHT Netzmaske)
IPAddress ip = IPAddress.Parse("192.168.0.0.");
IPAddress mask = IPAddress.Parse("255.255.255.0");
//Konvertierung der IPs in long-Zahlenwerte
byte[] ipBytes = ip.GetAddressBytes();
byte[] maskBytes = mask.GetAddressBytes();
long ipLong = (long)ipBytes[3] << 24;
ipLong += (long)ipBytes[2] << 16;
ipLong += (long)ipBytes[1] << 8;
ipLong += (long)ipBytes[0]
long maskLong = (long)maskBytes[3] << 24;
maskLong += (long)maskBytes[2] << 16;
maskLong += (long)maskBytes[1] << 8;
maskLong += (long)maskBytes[0];
//ODER statt den Bitverschiebungen
long ipLong = ip.Address;
long maskLong = mask.Address;
//Diese Eigenschaften sind allerdings OBSOLETE und sollten daher nicht verwendet werden!
long broadcastLong = ipLong | (~maskLong);
IPAddress broadcast = new IPAddress(broadcastLong);
Hallo zusammen,
leider herrscht hier imho ein Missverständnis vor.
Natürlich ist z.B. "192.168.0.255" die Braodcast-Adresse des Netzwerkes "192.168.0.0/24".
ABER: Es gibt nicht zum Spass im System.Net keine Funktion dafür, da 255.255.255.255 ebenfals der "Broadcast-Adresse" entspricht. Den Rest erledigt euer Netzwerk für euch - das warum ist auch einfach: nach RFC werden keine "Directed Broadcast" mehr gerouted, wodurch dieses Verhalten genau dem "Limited Broadcast" entspricht.
🙂
Xynratron
PS @ldr: deine Rechnung ist leider falsch.
Herr, schmeiss Hirn vom Himmel - Autsch!
Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.
PS @ldr: deine Rechnung ist leider falsch.
Versteh ich nicht. Sollte doch korrekt sein, oder?
NICHT 255.255.255.000 =
000.000.000.255
192.168.000.000 ODER
000.000.000.255 =
192.168.000.255
Eins sollte jedoch beachtet werden. Die an einem Router hängenden Rechner können ja verschiedenen Subnetzen angehören. Was wenn man nur eines ansprechen will?
Für den Fall eines gesamt-lokalen Broadcasts sollte man natürlich 255.255.255.255 verwenden.
Hallo zusammen,
@Idr: naja, die Rechnung ist theoretisch richtig, aber
long broadcastLong = ipLong || (!maskLong);
geht nicht.
zu den Bitoperationen gibts hier einen schönen Artikel.
🙂
Xynratron
Herr, schmeiss Hirn vom Himmel - Autsch!
Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.
Das passiert, wenn man nachts noch schreibt 😉 war natürlich ein | zuviel, das ! war auch falsch
Huhu,
ja, man sollte nicht zu spät posten, Ich hatte deinen Code gestern sogar gegen den Compiler geworfen und - keine Ahnung warum - es ging garnicht. | und ~ waren aber von mir korrigiert... Hatte dann irgendwann angenommen dass er long garnicht verknüpfen willl. egal.
🙂
Xynratron
Herr, schmeiss Hirn vom Himmel - Autsch!
Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.
Hallo,
ich hab mich mal den Code geprüft und das sind tatsächlich viele Fehler drin
byte[] ipBytes = new byte[] { 192, 168, 0, 0};
byte[] maskBytes = new byte[] { 255, 255, 255, 0};
uint ipUInt = 0;
ipUInt += (uint)ipBytes[3] << 24;
ipUInt += (uint)ipBytes[2] << 16;
ipUInt += (uint)ipBytes[1] << 8;
ipUInt += (uint)ipBytes[0];
uint maskUInt = 0;
maskUInt += (uint)maskBytes[3] << 24;
maskUInt += (uint)maskBytes[2] << 16;
maskUInt += (uint)maskBytes[1] << 8;
maskUInt += (uint)maskBytes[0];
uint broadcastLong = ipUInt | (~maskUInt);
Müsste nun gehen. Werde nun nur noch mit klaren Kopf posten 😁
Super vielen Dank!!!
Habt mir schon sehr weitergeholfen.
Gibt es jetzt auch noch eine Möglichkeit herauszufinden welche Netzwerkschnittstelle gerade aktiv ist? Also womit der Computer gerade ans Netzwerk angeschlossen ist (WLAN oder Ethernet)?
mfg
Ich habs noch nie benutzt aber es gibt die Broadcast Adresse in System.Net.IPAddress
Wegen den aktiven Verbindungen müsstest bei Google eigentlich schon was finden können. Hier werden z.B. alle lokalen IP Adressen aufgeführt.
Oder halt mal in der MSDN schauen!
Gruß,
Tom