C# Socket an alle Netzwerkkarten binden

.Linux.

Cadet 3rd Year
Registriert
Mai 2010
Beiträge
36
Hallo alle zusammen,

ich beschäftige mich zur zeit etwas mit C# und bin gerade dabei mir ein kleines Programmiertool für meine "Selfmade-Schaltboxen" zu basteln.

Und zwar möchte ich folgendes realisieren:
Ich habe mehrere Geräte im Netzwerk verteilt (nehmen wir mal an 3 mit den IP´s 192.168.15.10, 192.168.15.15 und 192.168.15.55).

Ich mache nun in meinem Programm einen "Broadcast-Socket" auf und sende ein Datenpaket das die Geräte als "Befehl" zum senden der eigenen Daten (ebenfalls über Broadcasts) verstehen.

Funktioniert auch alles so wie es soll nur habe ich auf manchen anderen Computern mit mehreren aktiven Netzwerkverbindungen (Lokales Netz mit den Geräten und z.B. eine openVPN-Verbindung) das problem dass der Broadcast nicht an alle Netze geht.
Soll heißen der Befehl wird zwar gesendet, aber dummerweise nicht an mein lokales Netzwerk sondern zufälligerweise an meine openVPN-Verbindung...

Gibt es irgendwie eine möglichkeit festzulegen an welches Netzwerkinterface der socket gebunden wird oder kann ich irgendwie an alle Netzwerke gleichzeitig etwas senden?

Hört sich zwar etwas komisch an, aber ich hoff jetzt einfach mal dass mich jemand versteht:D:D


Hier noch meine Sendefunktion:
Code:
        private void SendRequest(byte identifier)
        {
            byte[] data = new byte[3];

            Socket bcSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            IPEndPoint iep1 = new IPEndPoint(IPAddress.Broadcast, 2847);
            bcSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);

            data[0] = (byte)'R';
            data[1] = (byte)'C';
            data[2] = identifier;

            bcSocket.SendTo(data, iep1);
            bcSocket.Close();
            DatenTabelle.Rows.Clear();
        }
 
mach mal "Route Print" wenn du deine VPN verbindung offen hast.

Ich vemute du hast einfach eine höhere Metric (kleiner) bei dem VPN netz daher nimmt er diese(virtuelle VPN) Karte für den BC

Edit: So weit ich weiß, kannst du das nicht beeinflussen, da du an den IP Stack bindest und nicht an eine "Karte"
 
Zuletzt bearbeitet:
Du kannst den Socket an einen bestimmten IPEndPoint binden per Socket.Bind(IPEndPoint localEP).

Ich habs mal probiert und nen Socket an die IP meiner WLAN-Karte gebunden:
PHP:
IPAddress ip = null;

foreach (NetworkInterface netInf in NetworkInterface.GetAllNetworkInterfaces())
{
    if (netInf.NetworkInterfaceType == NetworkInterfaceType.Wireless80211
        && netInf.OperationalStatus == OperationalStatus.Up)
    {
         var adresses = netInf.GetIPProperties().UnicastAddresses;

         foreach (IPAddressInformation info in adresses)
         {
              if (info.Address.AddressFamily == AddressFamily.InterNetwork)
              {
                   ip = info.Address;
                   goto LeaveLoops;
              }
         }
     }
}

LeaveLoops:

if (ip != null)
{
     Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);                
     socket.Bind(new IPEndPoint(ip, 0));
}

Ob dir dann das Routing letztendlich nicht doch nen Strich durch die Rechnung macht, kann ich nicht sagen, aber nen Versuch ist es wert.
 
Zuletzt bearbeitet:
HeyHey,

war das Routing dran schuld.
Den endpoint muss ich ja auf "IPAddress.Broadcast" lassen da ich sonst nur auf die eine IP von der Karte eben sende.

Jetzt brauch ich nur noch ne möglichkeit die Metrik über mein Programm zu manipulieren :evillol:

Dooferweise ists ja bei jedem Rechner bei dem ich das probier etwas anderst mit den verbindungen.

Jedenfalls vielen dank für den Input:D
 
1.) Hast du es schon mit IPAddress.Any probiert? Broadcasts werden von Routern sowieso nicht weitergeleitet.

2.) Du kannst über den Shell Befehl route add eine Route hinzufügen, das würde ich aber schön bleiben lassen. Man sollte keine Annahmen darüber treffen, wie der Rechner ins Netz angebunden ist. Es ist auch das Senden von Broadcasts selbst nur in den wenigsten Fällen eine saubere Lösung, da man keine Annahme darüber treffen kann, welche Rechner sich in welchem Subnetz befinden. Diese Aufteilung ist nur eine zufällige abhängig von der Infrastruktur und das kann sich jederzeit ändern. Ich weiß es gibt VLANs, aber das tut sich in kleinen und mittleren Firmen meistens keiner an.
 
Zurück
Oben