Laden...

Broadcast mit mehreren Netzwerkkarten

Erstellt von Christel vor 10 Jahren Letzter Beitrag vor 10 Jahren 9.848 Views
C
Christel Themenstarter:in
448 Beiträge seit 2007
vor 10 Jahren
Broadcast mit mehreren Netzwerkkarten

Guten Morgen,
in meiner Anwendung suche ich per Broadcast alle Ethernetverbindungen auf dem PC. Das funktioniert soweit, nur ein Problem besteht. Wenn es am PC mehrere Netzwerkkarten gibt, wird bei der Suche nur eine davon einbezogen. Warum ist das so? Wie kann ich meinen Code ändern, um alle Netzwerkkarten einzubeziehen?

Hier der Code-Ausschnitt:


bool finderror = false;
byte[] sendbuf = { 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5F, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
                            
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

try
{
    uint[] IPaddress = new uint[100];
    ushort[] nodeID = new ushort[100];

    s.ReceiveTimeout = 1000; //1000 ms Antwortzeit zugelassen
    IPAddress broadcast = IPAddress.Parse("255.255.255.255");

    IPEndPoint ep = new IPEndPoint(broadcast, 2000);
    SocketAddress socketAddress = ep.Serialize();
    s.EnableBroadcast = true;
    s.SendTo(sendbuf, ep);
}

catch (SocketException ex)
{
    finderror = true;
}

finally
{
    while (!finderror)
    {
        try
        {
             s.Receive(sendbuf);
             _SearchIdIpList.Add((long)sendbuf[15] << 24 | (long)sendbuf[16] << 16 | (long)sendbuf[17] << 8 | (long)sendbuf[18]);
         }
         catch
         {
             finderror = true;
         }
     }
    s.Close();
}

Ich würde mich über Hinweise freuen und danke im Voraus,
Christel

Es ist schlimm, eine Ausnahme zu sein, aber noch schlimmer, keine zu sein.

16.842 Beiträge seit 2008
vor 10 Jahren

Wieso benutzt Du nicht einfach Windows oder .NET Schnittstellen, um die Netzwerkkarten zu erhalten?

C
Christel Themenstarter:in
448 Beiträge seit 2007
vor 10 Jahren

Wieso benutzt Du nicht einfach Windows oder .NET Schnittstellen, um die Netzwerkkarten zu erhalten?

Das wäre grundsätzlich kein Problem. Aber wie binde ich die Liste der so erhaltenen Schnittstellen in mein Broadcast ein? Genau dort scheitere ich nämlich ...

Danke,
Christel

Es ist schlimm, eine Ausnahme zu sein, aber noch schlimmer, keine zu sein.

16.842 Beiträge seit 2008
vor 10 Jahren

Keine Ahnung, was Du meinst.

C
Christel Themenstarter:in
448 Beiträge seit 2007
vor 10 Jahren

Keine Ahnung, was Du meinst.

Ich versuche es zu erklären.

Angenommen, ich erzeuge mit Systemfunktionen die Liste der Netzwerkkarten.
Wie muss ich diese Liste in meinem oben geposteten Code einsetzen, um alle diese Karten in mein Broadcast einzubeziehen?

Oder verstehe ich hier etwas ganz falsch? Ist das Broadcast dann gar überflüssig?

Sorry, dass ich das frage, aber es ist Code, den ich erst kürzlich übernommen habe, der aber nicht alle Anforderungen erfüllt und daher von mir überarbeitet werden muss.

Danke, Christel

Es ist schlimm, eine Ausnahme zu sein, aber noch schlimmer, keine zu sein.

16.842 Beiträge seit 2008
vor 10 Jahren

Du brauchst kein Broadcast um an die Netzwerkinfos zu kommen.
Einfach mal in Google "c# get network interfaces" eintippen und Du kommst auf NetworkInterface Class und damit auch auf NetworkInterface.GetAllNetworkInterfaces Method

C
Christel Themenstarter:in
448 Beiträge seit 2007
vor 10 Jahren

OK, danke für Deine Hilfe,
Christel

Es ist schlimm, eine Ausnahme zu sein, aber noch schlimmer, keine zu sein.

156 Beiträge seit 2010
vor 10 Jahren

Keine Ahnung, was Du meinst.

Wenn Du einen Broadcast absetzt nimmt .NET irgend eine Netzwerkschnittstelle. Wenn Du (wie im Normalfall) nur eine Netzwerkkarte drinnen hast, das passt das auch. Wenn Du aber mind. 2 Netzwerkkarten drinnen (DVB-Karte/VPN/...) wird der Boradcast zwar über alle Netzwerkschnittstelle geschickt - aber mit dem falschen Absender. Unter 1.1 hat er bei mir immer die IP von der DVB Karte genommen.

@OP1.Liste der Netzwerkkarten abrufen 1.auf jeder Netzwerkkarte einen Socket einrichten 1.Broadcast über jeden Socket absetzen

hand, mogel

btw: 255.255.255.255 funktioniert nur wenn es im Gateway frei geschaltet ist

C
Christel Themenstarter:in
448 Beiträge seit 2007
vor 10 Jahren

Danke, mogel, für's Verstehen meiner Problematik.
Du beschreibst genau das, was ich tun möchte.

Die Suche der Netzwerkkarten (Schritt 1) via GetAllNetworkInterfaces() sollte kein Problem sein, das Broadcast (Schritt 3) ebenfalls nicht.
Verständnisprobleme habe ich mit Schritt 2, nämlich der Einrichtung eines Socket auf einer Netzwerkkarte.
Wie erzeuge ich die Zuordnung zwischen Socket und Netzwerkkarte? s.Bind()? Siehe ??? im Code:

              
NetworkInterface[] niList = NetworkInterface.GetAllNetworkInterfaces();
byte[] sendbuf = { 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5F, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };// Encoding.ASCII.GetBytes("Hannes");
foreach (NetworkInterface ni in niList)
    if (ni.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
    {
        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

        ???

        s.ReceiveTimeout = 1000; //1000 ms Antwortzeit zugelassen

        IPAddress broadcast = IPAddress.Parse("255.255.255.255");
        IPEndPoint ep = new IPEndPoint(broadcast, 2000);
        SocketAddress socketAddress = ep.Serialize();
        s.EnableBroadcast = true;
        s.SendTo(sendbuf, ep);
    }

Vielen Dank im Voraus,
Christel

Es ist schlimm, eine Ausnahme zu sein, aber noch schlimmer, keine zu sein.

W
872 Beiträge seit 2005
vor 10 Jahren

Bind ist schon das richtige Schlagwort.
255.255.255.255 sieht merkwuerdig aus - Eine IP-Adresse ist wegen des Routings immer genau einer Netzwerkkarte zugeordnet, ergo brauchst Du unterschiedliche Broadcast-Adressen pro Netzwerkkarte.
Dann kommt es dann wieder drauf an, ob Du IP4 oder IP6 benutzten willst.
Du bist mit Deinem Programm schon sehr weit unten in der Netzwerkschicht.

C
Christel Themenstarter:in
448 Beiträge seit 2007
vor 10 Jahren

Danke erstmal, weismat.

Die Broadcast-Adresse 255.255.255.255 funktionierte bisher zuverlässig, ohne Bind() und mit nur einer Netzwerkkarte, deshalb steht sie so im Code. Ich hatte auch bereits vermutet, dass ich mit unterschiedlichen Broadcast-Adressen, abhängig von der Adresse der Netwerkkarte arbeiten muss. Mir stellen sich folgende Fragen:

  1. Wie bestimme ich die zur Netztwerkkarte passende Broadcastadresse aus den IP-Properties der Netzwerkkarte?
  2. Wenn ich es richtig verstehe, führt Bind eine Anbindung des Sockets an einen lokalen EndPoint durch. Wie bestiimme ich die IP Adresse dieses EndPoints aus den IP-Properties der Netzwerkkarte?

Sind beide Aktionen (spezielle Broadcast-Adresse UND Bind()) notwendig oder sind sie redundant?

Ich möchte mit IP4 arbeiten.

Danke, Christel

Es ist schlimm, eine Ausnahme zu sein, aber noch schlimmer, keine zu sein.

W
872 Beiträge seit 2005
vor 10 Jahren

Beschreib noch mal genau, was Du erreichen willst - und das moeglichst praezise.
Ethernetverbindungen mittels Broadcast ermitteln geht nicht.
Ethernet bedeutet den physischen Layer.
Schau Dir dazu, das OSI-Modell an.

C
Christel Themenstarter:in
448 Beiträge seit 2007
vor 10 Jahren

Ich beschreibe mal mein Problem:

Mein PC hat eine oder mehrere Netzwerkkarten, BS ist Windows 7, 64 bit.

Der PC ist mit mehreren externen Geräten über Ethernet verbunden. Diese sind so programmiert, dass sie bei einer bestimmten Message mit ihrer IP-Adresse antworten. Der PC sendet also diese Message per Broadcast an alle über Ethernet verbundenen Geräte und wertet die zurückkommenden Messages aus.

Es ist sozusagen eine Suchroutine über Ethernet, um anschließend mit den Geräten zu kommunizieren und diese remote anzusteuern.

Bei XP funktionierte das hervorragend, auch mit mehreren Netzwerkkarten.
Bei Windows 7 antworten leider nur die Geräte, die an einer (bestimmten) Netzwerkkarte hängen. Die anderen bleiben stumm. Ich vermute, dass sie entweder die Message nicht erhalten oder ich - warum auch immer - ihre Rückantwort nicht empfangen kann.

Konkret: Gerät steckt an Netzwerkkarte A, Suche bringt: 0 Geräte gefunden. Benutzer steckt Gerät an Karte B: Suche erfolgreich!

Konnte ich das Problem jetzt verständlich beschreiben? Bei offenen Fragen bitte gerne nachhaken.

Ich danke Dir für Deine Geduld,
Christel

Es ist schlimm, eine Ausnahme zu sein, aber noch schlimmer, keine zu sein.

16.842 Beiträge seit 2008
vor 10 Jahren

Danke weismat. 👍

Dann erörtere doch erst mal das genaue Probleme, statt nun irgendwas zu versuchen, was im Ansatz schon dubios ist.
Find doch erst mal raus, ob die Nachricht gar nicht raus geht, oder der Client vergeblich antwortet.

Aber jetzt einfach mal - ohne zu Wissen, woran's liegt - irgendwas zu machen, ist doch Zeitverschwendung..!

W
955 Beiträge seit 2010
vor 10 Jahren

Hast Du denn mit wireshark mal geschaut ob die Anfragen rausgehen?

W
872 Beiträge seit 2005
vor 10 Jahren

Christel, schau Dir mal den Wikipedia-Artikel zu Broadcast an.
Dein Programm kann zum Beispiel nicht funktionieren, wenn das Routing fuer die Broadcast-Adresse FF:FF:FF:FF auf Netzwerkkarte 1 zeigt, aber das Geraet an Netzwerkkarte 2 haengt.
Gleiches Problem, wenn auch ein Router dazwischen haengt.
Networking ist komplizierter als einfach nur ne Netzwerkkarte auszuwaehlen. Gerade bei Broadcast/Multicast muss auch die Konfiguration des PC stimmen.

C
Christel Themenstarter:in
448 Beiträge seit 2007
vor 10 Jahren

Ja, den Wikipedia-Artikel habe ich mir schon vorher angeschaut, werde aber nicht aus allen Details schlau.

Das Problem ist, dass ich das bestehende Suchverfahren so übernommen habe und dieses nun mit wenig Aufwand auf Windows 7 portieren soll. Netzwerkerfahrungen habe ich keine. Deshalb hatte ich hier Hilfe gesucht. Wenn das alles so hochkompliziert ist, muss ich das Problem wohl soweit verschieben, bis ich die Zeit für eine aufwändigere Recherche bekomme.

Trotzdem danke, Christel

Es ist schlimm, eine Ausnahme zu sein, aber noch schlimmer, keine zu sein.

P
660 Beiträge seit 2008
vor 10 Jahren

Bei deinem Problem geht es doch darum, zu ermitteln ob sich ein bestimmter rechner (welches
deinen dienst installiert hat) zu ermitteln, richtig? wieso verwendest du nicht bestimmte feste
IP-adressen (kp, ir eine im bereich von x.y.z.128-254, wenn die IP nicht zugewisen werden kann weil
bereits vorhanden, einfach inkrementieren) mit Ports (ein port zum senden, einer zum empfangen)
und schickst dann einfach nachrichten an diesen Adressbereich (mit dem Port halt) und guckst dann
von wo eine Antwort kommt. Müsstest ggf. Router und firewalls konfigurieren. Bei der
Windowsfirewall gibts bestimmmt komponenten/snippets die das automatisch machen.

MfG
ProGamer*Der Sinn Des Lebens Ist Es, Den Sinn Des Lebens Zu Finden! *"Wenn Unrecht zu Recht wird dann wird Widerstand zur Pflicht." *"Ignorance simplifies ANY problem." *"Stoppt die Piraterie der Musikindustrie"

A
350 Beiträge seit 2010
vor 10 Jahren

Hast du Zugriff auf die Clients und den Server Codetechnisch ?

Warum dann nicht den Ansatz wählen, dass die Clients einen festen Server als Ansprechpartner haben (oder einen DNS Namen) und sich bei ihm melden.
So brauchst du das Broadcasting nicht

185 Beiträge seit 2005
vor 10 Jahren

m.E musst du den Broadcast an all deine Netze schicken.

Jede deiner Netzwerkkarten hat ja eine IP
z.B.
192.168.0.x
192.168.10.x

also sendest du den Broadcast an 192.168.0.255 und 192.168.10.255

16.842 Beiträge seit 2008
vor 10 Jahren

Was aber die von ProGamer angesprochene Situation nicht ändert.
Wenn man mit einem Broadcast alle Clients sucht, dann ist es meist so, dass die Broadcasts an den Routern / Switchen hängen bleiben - vor allem in Unternehmensumgebungen.

Die Idee ist gut, die Realität eher also suboptimal.

Besser ist es hier, wie Ahrimaan schrieb, einen festen Server zu deklarieren, bei dem sich die Clients melden.
Der Server kann sich die IP ja problemlos merken, und dann immer wieder eine Verbindung testen, wenn der Client sich mal nicht gemeldet hat. Aber die initiale Kommunikation sollte beim Einrichten des Clients passieren.

C
Christel Themenstarter:in
448 Beiträge seit 2007
vor 10 Jahren

Es geht um die Ethernet-Kommunikation zu externen Geräten, die keine PCs sind, sondern um Geräte mit einem Microcontroller, die eine Ethernetschnittstelle unterstützen. Die IP-Adresse dieser externen Geräte ist frei konfigurierbar und kann nicht fest zugeordnet werden.

Meine PC Software dient dazu, diese externen Geräte zu konfigurieren und anzusteuern. Es gibt neben Ethernet noch weitere unterstützte Schnittstellen (RS232/Rs485, USB, ...)

Die Suche dient lediglich der Kontaktaufnahme zum externen Gerät. Codetechnischen Zugriff habe ich nicht.

Dem PC mit der Steuersoftware eine feste IP zuzuordnen, um von Geräteseite aktiv zu verbinden geht leider nicht, da diese Software auch bei Kunden laufen sollen und ich dort keinen Einfluss uf die PC-Konfiguration habe.

Jede deiner Netzwerkkarten hat ja eine IP
z.B.
192.168.0.x
192.168.10.x

also sendest du den Broadcast an 192.168.0.255 und 192.168.10.255

Das war mein erster Ansatz, welcher leider nicht funktioniert, nicht mal für nur eine Netzwerkkarte.

Christel

Es ist schlimm, eine Ausnahme zu sein, aber noch schlimmer, keine zu sein.

W
872 Beiträge seit 2005
vor 10 Jahren

Christel,
An sich machst Du doch schon von vornherein alles richtig.
Der Kunde muss das Geraet so anschliessen, dass der Broadcast durchgeht und Du musst das Verhalten entsprechend dokumentieren.
Dein Programm kann nicht Netzwerkprobleme loesen.

C
Christel Themenstarter:in
448 Beiträge seit 2007
vor 10 Jahren

Der Kunde muss das Geraet so anschliessen, dass der Broadcast durchgeht und Du musst das Verhalten entsprechend dokumentieren.
Dein Programm kann nicht Netzwerkprobleme loesen.

Das stimmt schon. Jedoch ist der Kunde von Windoes XP her gewöhnt, dass er seine Ethernetverbindung an IRGENDEINE Netzwerkkarte anstecken kann, auf den "Suchen"-Knopf drückt ... und alle gefundenen Geräte werden angezeigt. Dann kann er das gewünschte auswählen, sich verbinden und die Konfiguration beginnen.

Bei Windows 7 kann es passieren, dass die Suche ergebnislos bleibt und das Problem erst dadurch zu lösen ist, dass er sein Ethernetkabel umstöpseln muss, um erneut zu suchen. Das ist allerdings nicht so komfortabel. Daher die Forderung nach einer "schnellen" Lösung.

Sollte diese nicht möglich sein, hilft wohl kurzfristig nur ein entsprechender Hinweis in der Online-Hilfe und Dokumentation.

Danke und Gruß von Christel

Es ist schlimm, eine Ausnahme zu sein, aber noch schlimmer, keine zu sein.

P
660 Beiträge seit 2008
vor 10 Jahren

Jedoch ist der Kunde von Windoes XP her gewöhnt

dann sag dem kunden doch einfach dass dein Prog nur auf XP maschinen läuft XD

MfG
ProGamer*Der Sinn Des Lebens Ist Es, Den Sinn Des Lebens Zu Finden! *"Wenn Unrecht zu Recht wird dann wird Widerstand zur Pflicht." *"Ignorance simplifies ANY problem." *"Stoppt die Piraterie der Musikindustrie"