Laden...

Ping Abfrage in WPF/C#

Erstellt von InSiDeR vor 12 Jahren Letzter Beitrag vor 12 Jahren 6.219 Views
I
InSiDeR Themenstarter:in
95 Beiträge seit 2011
vor 12 Jahren
Ping Abfrage in WPF/C#

Hallo zusammen,
ich habe eine DataGrid, welche 3 Spalten hat:
Name, Computer, IP Adresse

Nun möchte ich a) den Inhalt der Spalten "Computer" und "IP Adressen" haben.
Und b) möchte ich Ping Requests setzen auf Computername und IP Adresse.

Möchte eben prüfen, ob eine IP Adresse eine Antwort gibt. Dann den Computernamen in der Liste mit der gespeicherten IP Adresse vergleichen und entsprechende "Bildchen" anzeigen lassen.

Mein Code:

private void pingRequest()
        {
            Ping p = new Ping();
            PingReply pr;

            string ip = "IP ADRESSE AUS DATAGRID";
            string pcname = "COMPUTER NAME AUS DATAGRID";

            try
            {
                pr = p.Send(pcname, 25);
                if (pr.Address.ToString() == ip)
                    setpic(pic_green);
                else
                    setpic(pic_yellow);
            }
            catch // Fehlerhafte Namensauflösung
            {
                try
                {
                    pr = p.Send(ip, 25);
                    if (pr.Status == IPStatus.Success)
                        setpic(pic_orange);
                    else
                        setpic(pic_red);
                }
                catch
                {
                    setpic(pic_red);
                }
            }
        }

        private void setpic(Image p)
        {
            pic_grey.Visibility = Visibility.Collapsed;
            pic_red.Visibility = Visibility.Collapsed;
            pic_green.Visibility = Visibility.Collapsed;
            pic_yellow.Visibility = Visibility.Collapsed;
            pic_orange.Visibility = Visibility.Collapsed;
            p.Visibility = Visibility.Visible;
        }

Problem: Die Klasse "Ping" kennt mein Programm nicht.
Selbst mit "using System.Net.Networkinformation" klappt es nicht.

Könnte mir jemand erläutern, wie ich nun an Computername, IP Adresse komme und ob es eine Alternative zur Ping Klasse in WPF gibt?

Vielen Dank

Mit freundlichen Grüßen,
InSiDeR

G
538 Beiträge seit 2008
vor 12 Jahren

Die Klasse "Ping" gibt es seit .NET 2.0 und ist in 4.0 immer noch vorhanden.
Du findest sie in intantiierst sie so:


var p = new System.Net.NetworkInformation.Ping();

Sofern du die System.dll referenzierst ist diese Klasse vorhanden und ohne System.dll wird's langweilig in .NET.

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)

I
InSiDeR Themenstarter:in
95 Beiträge seit 2011
vor 12 Jahren

Hallo Grumbler85,
danke für deine Antwort.

Der Verweis "System" wurde bereits hinzugefügt.

var p = new System.Net.NetworkInformation.Ping();
            var pr = new System.Net.NetworkInformation.PingReply();

Klappt leider nicht!

Fehlermeldung:
Der Typ- oder Namespacename "PingReply" konnte nicht gefunden werden. (Fehlt eine Using-Direktive oder ein Assemblyverweis?)

Fehlermeldung:
Der Typ- oder Namespacename "Ping" ist im Namespace "System.Net.NetworkInformation" nicht vorhanden. (Fehlt ein Assemblyverweis?)

//edit: siehe Anhang

Mit freundlichen Grüßen,
InSiDeR

W
872 Beiträge seit 2005
vor 12 Jahren

Welche .Net Frameworkversion benutzt Du?
LautMSDN

.NET Framework

Supported in: 4, 3.5, 3.0, 2.0
.NET Framework Client Profile

Supported in: 4, 3.5 SP1

849 Beiträge seit 2006
vor 12 Jahren

Hallo,

ich glaube das Problem besteht darin, das kein WPF sondern Silverlight verwendet wird. Denn in Silverlight sieht die Auswahl genau so aus wie im Screenie.

I
InSiDeR Themenstarter:in
95 Beiträge seit 2011
vor 12 Jahren

Ich verwende .NET Framework 4.0.

Habe eine WPF Oberfläche mit Expression Blend 4 gestaltet und anschließend in Visual Studio 2010 geöffnet um damit zu arbeiten.

//edit:
Das Problem ist, dass ich zwei Projekte so gesehen in einem habe.

Einmal WakeOnLAN (Programmlogik, Silverlight)
Einmal WakeOnLANSite (Serverseitig, HTML Aufruf)

Auf der WakeOnLANSite habe ich alle Klassen zur Verfügung hingegen bei Silverlight natürlich nicht.

Überlege, ob es ratsam ist statt der Default.html eine ASP.NET seite zu nehmen und darüber den Code laufen zu lassen.

Projektbeschreibung:
Möchte von zu Hause aus via Citrix auf das Firmennetz zugreifen und dort die WPF Oberfläche starten, wo mir alle Firmenrechner angezeigt werden. Diese sollen, wenn ich sie nacheinander anklicke, Ping Requests abschicken und anzeigen lassen, ob die Rechner eingeschaltet oder ausgeschaltet sind. Wenn ausgeschaltet, soll ich sie mittels eines Buttons Starten können.

Evtl. hilft die Projektbeschreibung ja weiter

Mit freundlichen Grüßen,
InSiDeR

U
1.688 Beiträge seit 2007
vor 12 Jahren

Evtl. hilft die Projektbeschreibung ja weiter

Wobei denn? Die Frage ist doch geklärt, oder? Du müsstest eben aus Silverlight einen Webdienst (WCF?) aufrufen.

3.430 Beiträge seit 2007
vor 12 Jahren

Hallo,

du verwendest also nicht WPF sondern Silverlight.
Silverlight hat nur einen Bruchteil der Bibliotheken von WPF, deshalb findest du auch deine Ping-Klasse nicht

IMHO ist es da besser wenn du direkt auf ASP.NET setzst. Für so eine einfache Aufgabe lohnt es sich nicht SL zu verwenden

Gruß
Michael

I
InSiDeR Themenstarter:in
95 Beiträge seit 2011
vor 12 Jahren

IMHO ist es da besser wenn du direkt auf ASP.NET setzst. Für so eine einfache Aufgabe lohnt es sich nicht SL zu verwenden

Soll ich das gesamte Projekt nun neu machen?

Habe bisher weder mit SL noch mit WPF gearbeitet. Das ist absolutes Neuland für mich und ich probiere mich da drin aus.

Für manche ist dies ne kleine Aufgabe, für mich ne riesengroße.
Jedenfalls wurde von meiner Firma die Voraussetzung getroffen, eine WPF Oberfläche zu nehmen.

Projektabgabe ist am 17.11.2011. Mal sehen ob ich das hinbekomme 😕
Über jede Hilfe wäre ich äußerst dankbar.

Mit freundlichen Grüßen,
InSiDeR

3.430 Beiträge seit 2007
vor 12 Jahren

Hallo,

also ich glaube es ist hier niemandem wirklich klar was du da machen willst.
Wenn du über Citrix zugreifst dann kannst du eine WPF (nicht silverlight) Applikation verwenden. Das funktioniert dann als eigenständige Applikation (nicht im Browser).

Wenn du es im Browser machen willst, dann kannst du eine ASP.NET Seite erstellen und evtl. ein Silverlight Plugin erstellen. Dabei hast du aber das Problem dass du von SL aus nicht direkt pingen kannst. D.h. du musst einen Webservice dazu verwenden (was das Ganze für Neulinge extrem verkompliziert)

Falls du als eine eigenständige Applikation auf dem Server (via Citrix) laufen lassen willst so kannst du ein WPF Projekt erstellen. D.h. du erstellst ein neues Projekt, aber wählst WPF und nicht Silverlight. In diesem Projekt hast du dann auch die nötigen Bibliotheken um das umzusetzen was du vorhast.

Gruß
Michael

I
InSiDeR Themenstarter:in
95 Beiträge seit 2011
vor 12 Jahren

Huhu,
habe jetzt nochmal nachgefragt.

Mir wurde eben gesagt:
"Du sollst eine SilverLight Webseite bauen, welche in Citrix aufgerufen werden soll. Die GUI dieser SilverLight Webseite ist mit WPF realisiert. Die Ping Abfragen und Zugriffe auf den Rechnern soll via Webservices realisiert werden."

Nichts anderes habe ich ja bisher gemacht. Habe nun eine WakeOnLAN und eine WakeOnLANSite. In WakeOnLAN ist meine xaml mit der Programmlogik. Meine WakeOnLANSite ist meine SilverLight Seite, welche aufgerufen wird.

Und genau wie michlG geschrieben hat, ist das sehr kompliziert für mich. Bei dem Webservice muss ich schauen wie ich das mache 😦 Da hab ich noch keine Ahnung.

//edit: Habe nun einen Webservice geschrieben "PingRequest".

[WebMethod]
        public string PingRequest(string computer, string IPAddress)
        {
            Ping p = new Ping();
            PingReply pr;
            string ip = IPAddress;
            string pcname = computer;

            try
            {
                pr = p.Send(pcname, 25);
                if (pr.Address.ToString() == ip)
                    return "pic_green";
                else
                    return "pic_yellow";
            }
            catch // Fehlerhafte Namensauflösung
            {
                try
                {
                    pr = p.Send(ip, 25);
                    if (pr.Status == IPStatus.Success)
                        return "pic_orange";
                    else
                        return "pic_red";
                }
                catch
                {
                    return "pic_red";
                }
            }
        }

Diesen integriere ich nun irgendwie in meine WakeOnLAN Anwendung. Dann sollte das doch eigentlich klappen, oder nicht?

Mit freundlichen Grüßen,
InSiDeR

U
1.688 Beiträge seit 2007
vor 12 Jahren

"Die GUI dieser SilverLight Webseite ist mit WPF realisiert."

Das ist Unsinn. Silverlight selbst ist ein "Plugin" im Browser und die Silverlight-Anwendung (die GUI) läuft in diesem Plugin. Das soll Dein "WakeOnLan" sein. Es gibt eine Ähnlichkeit zu WPF, aber es ist keins.

Heruntergeladen wird die Silverlight-Anwendung aus einer Webseite (WakeOnLANSite), die von irgendeinem Webserver bereitgestellt werden kann. Ist dies der IIS kann die Seite auch einen Webservice enthalten, auf den Du dann von Silverlight (also die Anwendung, die im Browser läuft) zugreifen kannst.

I
InSiDeR Themenstarter:in
95 Beiträge seit 2011
vor 12 Jahren

Das wurde mir zumindest so gesagt.

Ich bleib nun einfach bei meiner jetzigen Anwendung, einer SilverLight Webseite. Habe den Webservices für das Pingen erstellt nur spackt der lokale IIS grad rum und will den nich so recht integrieren.

Weiß eh noch nicht, wie ich auf die einzelnen Zeilen der DataGrid anspreche, da ich bei selectedItem.ToString() immer ein Objekt erhalte und keine Eigenschaft.

Mit freundlichen Grüßen,
InSiDeR