Laden...

Broadcastadresse herausfinden

Erstellt von bloodhound vor 15 Jahren Letzter Beitrag vor 15 Jahren 12.300 Views
B
bloodhound Themenstarter:in
35 Beiträge seit 2008
vor 15 Jahren
Broadcastadresse herausfinden

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

H
240 Beiträge seit 2006
vor 15 Jahren

Hallo bloodhound,

guck dir mal die Klasse System.Net.IPAddress an.

MfG hulkstar

691 Beiträge seit 2007
vor 15 Jahren

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

B
bloodhound Themenstarter:in
35 Beiträge seit 2008
vor 15 Jahren

Danke werde es mal ausprobieren.

mfg

T
433 Beiträge seit 2006
vor 15 Jahren

Ich würde mal hulkstars Tipp folgen.

Gruß,
Tom

B
bloodhound Themenstarter:in
35 Beiträge seit 2008
vor 15 Jahren

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

243 Beiträge seit 2005
vor 15 Jahren

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);
X
1.177 Beiträge seit 2006
vor 15 Jahren

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.

243 Beiträge seit 2005
vor 15 Jahren

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.

X
1.177 Beiträge seit 2006
vor 15 Jahren

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.

243 Beiträge seit 2005
vor 15 Jahren

Das passiert, wenn man nachts noch schreibt 😉 war natürlich ein | zuviel, das ! war auch falsch

X
1.177 Beiträge seit 2006
vor 15 Jahren

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.

243 Beiträge seit 2005
vor 15 Jahren

Hallo,

ich hab mich mal den Code geprüft und das sind tatsächlich viele Fehler drin

  1. Die Klasse IPAddress kann keine Netzmasken darstellen. Deswegen müssen die Masken gleich in Byteform angegeben werden.
    (Man kann natürlich auch die IP-Adressblöcke gleich in die Shiftoperationen einbauen, oder sogar als Literal reinschreiben)
byte[] ipBytes = new byte[] { 192, 168, 0, 0};
byte[] maskBytes = new byte[] { 255, 255, 255, 0};
  1. Ein long ist zu lang für eine IP-Adresse, deswegen wird er mit Nullen aufgefüllt. Daraus resultieren fehler beim NOT, da diese Nullen Einsen werden. Deswegen habe ich auf uint umgestellt.
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 😁

B
bloodhound Themenstarter:in
35 Beiträge seit 2008
vor 15 Jahren

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

T
433 Beiträge seit 2006
vor 15 Jahren

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