Ping Abfrage einbauen

Moderator: Moderatoren

Antworten
Jojo
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 48
Registriert: So, 22. Jul 2012 13:44

Ping Abfrage einbauen

Beitrag von Jojo »

Hallo zusammen,

ich möchte auf einem Sicherungsrechner eine Abfrage ins Programm schreiben das das Arbeiten mit dem Programm nur ermöglicht wenn der Hauptrechner auch wirklich aus ist (damit nicht ungewollt Daten vom Hauptrechner auf den Sicherungsrechner geschoben werden und dort alles überschreiben).

Also so in der Art:

ping an Hauptrechner
if ping positiv say "Hauptrechner auschalten!"
loop


Er soll also solange die Abfrage durchführen bis der Hauptrechner nicht ereichbar ist.
Wenn der Ping ins Leere läuft soll weitergemacht werden können.

Die Abfrage würde ich dann am Anfang des Programms schreiben.

Gäbe es auch eine Möglichkeit immer wieder (also auch während des laufenden Betriebes) abzufragen ob ein anderer Rechner via Ping erreichbar ist ohne das System übermäßig zu belasten?

Bin für jedweden Tipp dankbar.

Grüße
Jojo
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Ping Abfrage einbauen

Beitrag von AUGE_OHR »

Jojo hat geschrieben:Bin für jedweden Tipp dankbar.
Pablo Botella ( http://www.xbwin.com )
22. Februar 2009
ot4xb.examples
TPing

Code: Alles auswählen

#include "ot4xb.ch"
// ---------------------------------------------------------------------------
proc main()
? Ping( "127.0.0.1"      )
? Ping( "www.xbwin.com"  )
? Ping( "www.alaska-software.com" )
? "Press a key to close ..."
inkey(0)
return 
// ---------------------------------------------------------------------------
function Ping( cHost,nTimeOut)
local o     := TPing():New() 
local cStr,cIp
DEFAULT cHost := ""
cIp := TPing():cHostByName(cHost,nTimeOut)
DEFAULT cIp := ""
if o:Ping(cHost)
   cStr := cPrintf("%s [%s] %ims TTL:%3i",cHost,o:cIp,o:nTime,o:nTtl)
else
   cStr := cPrintf("%s [%s] -> FAIL",cHost,cIp)
end
o:Destroy()
return cStr
TestPing.zip
Beispiel von Pablo
(1.74 KiB) 507-mal heruntergeladen
gruss by OHR
Jimmy
Jojo
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 48
Registriert: So, 22. Jul 2012 13:44

Re: Ping Abfrage einbauen

Beitrag von Jojo »

Hallo Jimmy,

vielen Dank für die schnelle Rückantwort.
Ich habe mich aber doch dazu entschieden nur beim Programmstart einmalig eine Abfrage zu starten.

Aber auch da habe ich so meine Probleme...

Deshalb eine Frage an Alle:

Weshalb gibt dieser Teil im Programm...

Code: Alles auswählen

local hr := ''
run( "hostname >temp.txt 2>&1" )
hr = memoread( 'temp.txt' )
 if hr == 'meinHostname'   
 return(.t.)                    
else
...kein .t. zurück obwohl ich in der temp.txt genau meinen Hostnamen finde?

Im Debbuger springt er ab der Zeile "if hr==..." gleich zum Befehl nach"else".
Also erkennt er den korekten Hostnamen nicht. Weshalb?

HELP!

Ich mag FlagShip nicht #-o

Grüße
Jojo
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Ping Abfrage einbauen

Beitrag von brandelh »

HOSTNAME.EXE ... da muss man erst mal drauf kommen =D>

HOSTNAME > test.txt ... aus Sicht der CMD Box funktioniert das, aber es kann sein, dass es in einem Verzeichnis liegt, das NICHT zu deine EXE gehört.
Je nach Programmstart wird ein anderes Standardverzeichnis verwendet ... also testen mit fixem Namen z.B. dem der EXE.

Hast du das Gleiche mal mit Xbase++ probiert, mit FlagShip kenne ich mich nicht aus.

Aber warum nutzt du nicht die UMGEBUNGSVARIABLE COMPUTERNAME ?

in Xbase++ und Clipper wäre das so gegangen:

Code: Alles auswählen

cHostName := getenv("COMPUTERNAME")
mit SET kann man sich ansehen was es sonst noch gibt ...

Zu deinem Code ...

hr == 'meinHostname' ... kann es sein, dass eventuell Blanks oder GROßBUCHSTABEN verwendet werden ?
Ich würde immer so schreiben: lower(alltrim(hr)) == 'meinhostname' // ODER lower('meinHostname')

Code: Alles auswählen

run( "hostname >temp.txt 2>&1" )
ich weiß was HOSTNAME > test.txt macht, aber >temp.txt 2>&1 ist mir völlig fremd !
Gruß
Hubert
Jojo
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 48
Registriert: So, 22. Jul 2012 13:44

Re: Ping Abfrage einbauen

Beitrag von Jojo »

Hallo Hubert,

"2>&1" leitet STDERR auf STDOUT um.
So (wenn ich es richtig verstanden habe) bekomme ich auch Fehlermeldungen in meine temp.txt.

Ich hatte es ursprüngllich mit...

Code: Alles auswählen

 hr = alltrimm( memoread( 'temp.txt' )) 
...drin, aber das brachte auch nichts.

Es liegt aber nicht an der Groß- Kleinschreibung.
Der Inhalt von temp.txt entspricht genau meinem Hostnamen, aber dennoch git es ein .f. aus.. :banghead:
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Ping Abfrage einbauen

Beitrag von brandelh »

Sorry Jojo,

aber du bist in eine alte Falle getreten: Es ist nicht immer das im Paket, was draufsteht ;-)
Mit diesem Testprogramm hier erhalte ich genau deine Ergebnisse, der Rechnername steht zwar anscheinend in der Textdatei, aber ich erhalte .F. beim Vergleich mit ==

Code: Alles auswählen

#include "Gra.ch"
#include "Xbp.ch"
#include "Common.ch"

procedure main()
   local cTF := "temp.txt", cTxt, x

   runshell("/C hostname.exe > "+cTF)
   if fExists(cTF)
      ? "Testdatei existiert"
      cTxt := memoread(cTF)
      ? "Inhalt : -"+cTxt+"-"
      ? "Len:      ",len(cTxt), "ich erhalte 7, also 2 mehr als ich erwartet hätte ..."
      ? "Habe ich den Namen erwartet ?  ", "BURO1" == cTxt
      ? "6. ist chr(", asc(cTxt[6]),")"
      ? "7. ist chr(", asc(cTxt[7]),")"
      ? "so ginge es ...", cTxt = "BURO1"
      ? "oder gleich richtig anpassen ..."
      x := at(chr(13),cTxt)
      cTxt := left(cTxt,x-1)
      // welche Zeichen sieht man noch nicht ? chr(0), chr(10), chr(255) ...
      ? "Habe ich den Namen erwartet ?  ", "BURO1" == cTxt
   else
      ? "Datei wurde nicht, oder nicht hier erzeugt !"
   endif
   wait
return
Nachdem die Länge mit 7 Zeichen 2 Zeichen länger war als ich vom Namen erwartet hätte, habe ich mir den Inhalt von Zeichen 6 und 7 anzeigen lassen:

"BURO1"+chr(13)+chr(10) ist nunmal nicht genau gleich wie "BURO1"

Der Befehl HOSTNAME fügt eine Zeilenschaltung ein und das hat der Code nicht berücksichtigt.
Im Editor fällt das auch kaum auf, ähnlich wie chr(0), chr(10) oder chr(255) eben nichts drucken, aber dennoch etwas darstellen.

Hättest du per Zufall so gefragt hättest du gleich ein TRUE gesehen (und später über seltsame Fehler gestolpert) :

Code: Alles auswählen

if cTxt = "BURO1"
Gruß
Hubert
Jojo
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 48
Registriert: So, 22. Jul 2012 13:44

Re: Ping Abfrage einbauen

Beitrag von Jojo »

Hallo Hubert,

an einem Zeilenvorschub oder anderen nicht sichtbaren Zeichen kann es eigentlich nicht liegen.
Der Befehl "ALLTRIM" entfernt eben alles vor und hinter dem Text.

Im Editor ist auch kein Zeilenvorschub oder ähnliches zu sehen.
Der Cursor steht auf dem letzten Buchstaben...

Das ist es ja was ich nicht verstehe.

Der Inhalt meiner temp.txt entspricht meiner Meinung nach exakt meinem Hostnamen.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Ping Abfrage einbauen

Beitrag von brandelh »

Sorry, aber wie wäre es mal mit probieren wie LANG dein String tatsächlich ist !

Ich weiß nicht was Flagships Alltrim() macht, aber weder bei CLIPPER noch bei Xbase++ entfernt ALLTRIM() etwas anderes als Blanks
Der Inhalt meiner temp.txt entspricht meiner Meinung nach exakt meinem Hostnamen.
Deine MEINUNG ist hier nicht gefragt, sondern testen wie lange der String tatsächlich ist und was an jeder Position steht:

Code: Alles auswählen

for x := 1 to len(cVar)
    ? x, substr(cVar,x,1)
next
Nochmals sorry, aber ich konnte nicht anders. Auch meine Geduld ist begrenzt. 8)
Gruß
Hubert
Jojo
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 48
Registriert: So, 22. Jul 2012 13:44

Re: Ping Abfrage einbauen

Beitrag von Jojo »

SHIT! Du hast (leider) Recht. :oops:

Mein 9 Zeilen langer Hostname wird mit zehn Zeichen angezeigt.
O.K. Danke, jetzt weiß ich wieder in welche Richtung ich muss.

Übrigens: Kein Problem! Ich wäre auch gereizt wenn ich so wenig geschlafen hätte :-)

Grüße
Jojo
Antworten