C# Windows Forms alle Geräte im lokalen Netzt anzeigen?

2 Antworten

Kommt drauf an, was du mit "alle Geräte im lokalen Netzwerk anzeigen" meinst.

-------------------------------------------------

Wenn du damit meinst, dass du einfach nur eine Liste von sämtlichen Netzwerkgeräten haben willst, egal ob PC, Smartphone, Drucker, etc., dann dürfte dir die Antwort von PWolff ggf. helfen.

-------------------------------------------------

Wenn du damit meinst, dass du eine Liste von sämtlichen Netzwerkgeräten haben willst, auf denen dein Programm läuft (bzw. auf denen dein Programm nen Chatroom "hostet" (oder "hosted"? ;), jenachdem, wie das ganze ablaufen soll...), dann wäre ein UDP-Broadcast das Mittel der Wahl.

Dabei hat man auf den einzelnen PCs nen "Listener", der auf den eingehenden Broadcast (z.B. "Chatclient 9183 an alle Chatserver, bitte melden." ;) wartet und beim Empfang des selben eine Unicast-Antwort schickt (z.B. "Hier ist Chatserver 8472, zum Chatten verbinde dich mit mir auf TCP-Port 3874." ;), und auf der anderen Seite den Broadcast-Sender.

Hier noch ein rudimentäres Beispiel für die Broadcast-Komponente (musste natürlich noch anpassen):

Der Sender:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace MarcoPolo{
class Polo{
public static void Main(string[] args){
UdpClient client = new UdpClient(12345);
IPEndPoint ip = new IPEndPoint(IPAddress.Any, 12345);
while(true){
byte[] bytes = client.Receive(ref ip);
string message = Encoding.ASCII.GetString(bytes);
if(message.Equals("MARCO")){
Console.WriteLine("{0} shouted {1}. Responding with POLO...", ip, message);
bytes = Encoding.ASCII.GetBytes("POLO");
client.Send(bytes, bytes.Length, ip);
}
}
}
}
}

Der Empfänger:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Diagnostics;

namespace MarcoPolo{
class Marco{
public static void Main(string[] args){
UdpClient client = new UdpClient();
Console.WriteLine("Shouting MARCO...");
IPEndPoint ip = new IPEndPoint(IPAddress.Broadcast, 12345);
byte[] bytes = Encoding.ASCII.GetBytes("MARCO");
client.Send(bytes, bytes.Length, ip);

Stopwatch sw = new Stopwatch();
sw.Start();
while(sw.Elapsed.TotalSeconds < 20){
if(client.Available > 0){
ip = new IPEndPoint(IPAddress.Any, 12345);
bytes = client.Receive(ref ip);
string message = Encoding.ASCII.GetString(bytes);
Console.WriteLine("{0} responded with {1}.",ip,message);
}
}
client.Close();
}
}
}

Was machen diese Beispiele?

Ganz einfach:

Der Empfänger wartet auf einen Broadcast mit dem Inhalt "MARCO", sobald er diesen empfängt, sendet er an den Absender die Antwort "POLO".

Der Sender wartet nachdem er "MARCO" gesendet hat bis zu 20 Sekunden (kann natürlich beliebig angepasst werden) auf Antworten.

P.S.: Wenn du dieses Beispiel testen willst, starte zunächst den Empfänger (polo), dann den Sender (marco).

P.P.S.: Wie genau Sender und Empfänger die weitere Kommunikation aushandeln, musst du dir allerdings noch selbst überlegen...

P.P.P.S.: Sieh dir evtl. auch mal das an: https://de.wikipedia.org/wiki/Simple_Service_Discovery_Protocol

P.P.P.P.S.: Okay, nu is Ende mit den "P.S."s... ;)