Subnetzmaske der aktuellen Netzwerkverbindung

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Subnetzmaske der aktuellen Netzwerkverbindung

      Hallo Leute.
      Ich spiele mich momentan ein wenig mit UDP und Broadcasting mit der 39dll herum und habe schon erste erfolgreiche Tests gemacht. Um einen Broadcast im LAN durchzuführen muss allerdings die Subnetzmaske bekannt sein, um durch Kombination mit der eigenen IP die Broadcastadresse herauszufinden. In den meisten Fällen wird dies zwar 192.168.0.255 sein, allerdings möchte man ja auch andere Fälle abdecken können. Zudem soll das ganze automatisch erfolgen, man will ja einen Novizen nicht mit der Frage nach seiner Subnetzmaske überfordern, damit das Programm sich wie erwünscht verhält.
      Darum meine Frage: Kennt jemand einen relativ unkomplizierten Weg, die Subnetzmaske des aktuell aktiven Netzwerkadapters zu ermitteln (Ich würde unter Umständen auch die 39dll um diese Funktion erweitern, wenn sich sowas mit C++ machen lässt)?

      © 2008 by Teamgrill Productions

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von MasterXY ()

    • Also, die Funktion mplay_ipadress() gibt die lokale IP-Adresse des Computers zurück, egal ob du mplay_* Funktionen sonst wo verwendest bzw. initiierst oder nicht.

      In PHP gibts ja die substr() Funktion, bei GM ist das glaub ich string_copy, oder mittels copyboy's explode skript einfach am letzten punkt trennen, dann hast du die Maske.
      :thumbsup:
    • Offtopic:
      192.168.0.255 ist keine Subnetzmaske, sondern lediglich eine bereits berechnete Adresse für einen directed broadcast (falls Quell- und Zielnetz unterschiedlich sind) in das Netz 192.168.0.0 mit der Subnetzmaske 255.255.255.0 (kombiniert auch 192.168.0.0/24 geschrieben).

      Um nun eine beliebige Adresse für einen directed broadcast aus dem gewünschten Netz und einer Subnetzmaske zu berechnen, musst du zuerst ein bitweises NOT auf die Subnetzmaske durchführen (In deinem Beispiel 255.255.255.0 -> 0.0.0.255) und das Ergebnis dann mit der Netzwerkadresse addieren (192.168.0.0 + 0.0.0.255 = 192.168.0.255).

      Edit: Ich habe Bl@cksp@rks Beitrag übersehen. Sein Verweis auf GetAdaptersInfo macht meinen Beitrag im Prinzip überflüssig.
      2. Edit: Überflüssiger, fehlerhafter Codeschnipsel entfernt, siehe nachfolgende Beiträge.

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von cafaxo ()

    • @cafaxo
      Dein Code hat gleich mehrere Probleme. Zum einen gibst du den angeforderten Speicher am Ende der Funktion nicht wieder frei, wodurch ein memory leak entsteht, und zum anderen reagierst du nicht darauf, ob deine vorgegebene Größe des buffers ausreichend war. Die Funktion GetAdaptersInfo schreibt nämlich unter Umständen nicht nur ein einziges Objekt von IP_ADAPTER_INFO in den buffer, sondern ein ganzes Array solcher Objekte, die miteinander verkettet sind. Nämlich jeweils ein Objekt für jeden Adapter.

      MSDN schrieb:

      A pointer to a buffer that receives a linked list of IP_ADAPTER_INFO structures.

      Am besten hält man sich an das Beispiel auf MSDN. Dort wird GetAdaptersInfo zweimal aufgerufen. Das erste mal um die benötigte Größe des buffers zu erfahren und ein zweites mal, um die eigentlichen Daten zu holen. Wenn man es ganz genau nimmt, kann auch diese Methode fehlschlagen. Nämlich wenn zwischen dem ersten und zweiten Aufruf von GetAdaptersInfo beispielsweise ein neuer Adapter hinzukommt. Da die Aufrufe jedoch mit sehr sehr kurzem zeitlichen Abstand stattfinden, tritt das praktisch nie auf. Man könnte es aber leicht umgehen, indem man GetAdaptersInfo stattdessen einfach in einer Schleife aufruft.
    • @Bl@ckSp@rk: Natürlich hast du mit dem Memory Leak in meinem Codeschnippsel völlig recht. (Ich bin offensichtlich bereits von der GC von Java, bzw. dem ARC von Objektive-C zuviel verwöhnt.)

      Der Code war ursprünglich ein Teil einer Klasse und entnahm direkt einer Instanz von IP_ADAPTER_INFO die Subnetzmaske. Im Deconstructor dieser Klasse wurde der reservierte Speicherplatz dieser Instanz ordnungsgemäß freigegeben.
      Auch wurde in einer Schleife die Typen der Adapter erfasst, jedoch beachtete ich diesen signifikanten Teil nachlässigerweise beim "Zusammenschieben" des obigen Codeschnippsels nicht.

      Bl@ckSp@rk schrieb:

      Wenn man es ganz genau nimmt, kann auch diese Methode fehlschlagen. Nämlich wenn zwischen dem ersten und zweiten Aufruf von GetAdaptersInfo beispielsweise ein neuer Adapter hinzukommt. Da die Aufrufe jedoch mit sehr sehr kurzem zeitlichen Abstand stattfinden, tritt das praktisch nie auf. Man könnte es aber leicht umgehen, indem man GetAdaptersInfo stattdessen einfach in einer Schleife aufruft.


      Wenn ich dies korrekt verstanden habe, willst du in dieser Schleife zuerst durch den ersten Aufruf von GetAdaptersInfo die benötigte Größe ermitteln, und dann beim zweiten Aufruf überprüfen ob ein Overflow Fehler (falls eben zwischen den Aufrufen ein neuer Adapter hinzugefügt wurde und die im ersten Aufruf ermittelte Größe nicht mehr korrekt ist) aufgetreten ist. Erst wenn kein Overflow Fehler (d. h. die Adapteranzahl zwischen den Aufrufen nicht erhöht wird) auftritt, beendest du die Schleife und fahrst mit dem Erfassen der Informationen fort.

      Ich vertrete die Meinung, dass diese Schleife überflüssig ist, da ein Overflow Fehler bei einer nicht ausreichenden Buffergröße in diesem Szenario sehr unwahrscheinlich auftritt (wobei wir beide die gleiche Meinung vertreten). Bei einem tatsächlichen Auftreten wäre dies auch nicht weiter schlimm, da trotzdem die zuvor ermittelte Anzahl der Adapter erfasst wird.

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von cafaxo ()

    • Danke an Bl@ckSp@rk und cafaxo, werd mich mal in die genannten Funktionen einlesen und sehen was sich machen lässt.

      EDIT:
      Habe das Problem nun mithilfe der GetAdaptersInfo Funktion gelöst. Die selbe Funktion wurde bei der 39dll schon dazu benutzt um u.a. die MAC-Adresse zurückzuliefern, ich hab mir nun die Funktion für die Subnetzmaske zusätzlich in die dll eingebaut.

      © 2008 by Teamgrill Productions

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von MasterXY ()

    • Hier bitte. Meine neue kompilierte Version mit der extra Funktion.
      Dateien
      • 39dll.zip

        (41,41 kB, 176 mal heruntergeladen, zuletzt: )

      © 2008 by Teamgrill Productions